Чтение файла с помощью fscanf () в C

Я должен считать и распечатать данные из файла.
Я записал программу как ниже,

#include<stdio.h>
#include<conio.h>
int main(void)
{
char item[9], status;

FILE *fp;

if( (fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL)
{
    printf("No such file\n");
    exit(1);
}  

 if (fp == NULL)
{
    printf("Error Reading File\n");
}

while(fscanf(fp,"%s %c",item,&status) == 1)  
{  
       printf("\n%s \t %c", item,status);  
}  
if(feof(fp))  
{            
         puts("EOF");     
}  
else  
{  
 puts("CAN NOT READ");  
}  
getch();  
return 0;  
}  

файл database.txt содержит
Test1 A
Test2 B
Test3 C

Когда я выполняю код, он печатает

НЕ МОЖЕТ ЧИТАТЬ.

Помогите мне узнать проблему.

15
задан Guru 28 July 2010 в 10:06
поделиться

4 ответа

Прежде всего, вы дважды тестируете fp . поэтому printf ("Ошибка чтения файла \ n"); никогда не выполняется.

Тогда вывод fscanf должен быть равен 2 , поскольку вы читаете два значения.

26
ответ дан 1 December 2019 в 00:49
поделиться

В вашем коде:

while(fscanf(fp,"%s %c",item,&status) == 1)  

почему 1, а не 2? Функции scanf возвращают количество прочитанных объектов.

3
ответ дан 1 December 2019 в 00:49
поделиться

fscanf обработает 2 аргумента и, таким образом, вернет 2. Ваш оператор while будет ложным, поэтому никогда не будет отображаться то, что было прочитано, плюс поскольку он прочитал только 1 строку, если он не находится в EOF, в результате получается то, что вы видите.

1
ответ дан 1 December 2019 в 00:49
поделиться

scanf () и друзья возвращают количество успешно сопоставленных элементов ввода. Для вашего кода это будет два или меньше (в случае меньшего количества совпадений, чем указано). Короче говоря, будьте осторожнее со страницами руководства:

#include <stdio.h>
#include <errno.h>
#include <stdbool.h>

int main(void)
{
    char item[9], status;

    FILE *fp;

    if((fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL) {
        printf("No such file\n");
        exit(1);
    }

    while (true) {
        int ret = fscanf(fp, "%s %c", item, &status);
        if(ret == 2)
            printf("\n%s \t %c", item, status);
        else if(errno != 0) {
            perror("scanf:");
            break;
        } else if(ret == EOF) {
            break;
        } else {
            printf("No match.\n");
        }
    }
    printf("\n");
    if(feof(fp)) {
        puts("EOF");
    }
    return 0;
}
12
ответ дан 1 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: