Ответ 1
Прежде всего, вы дважды тестируете fp
. поэтому printf("Error Reading File\n");
никогда не выполняется.
Затем вывод fscanf
должен быть равен 2
, так как вы читаете два значения.
Мне нужно прочитать и распечатать данные из файла.
Я написал программу, как показано ниже,
#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
Когда я запускаю код, он печатает
НЕ МОЖЕТ ПРОЧИТАТЬ.
Пожалуйста, помогите мне разобраться с проблемой.
Прежде всего, вы дважды тестируете fp
. поэтому printf("Error Reading File\n");
никогда не выполняется.
Затем вывод fscanf
должен быть равен 2
, так как вы читаете два значения.
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;
}
В вашем коде:
while(fscanf(fp,"%s %c",item,&status) == 1)
почему 1, а не 2? Функции scanf возвращают количество прочитанных объектов.
fscanf
будет обрабатывать 2 аргумента и, таким образом, возвращать 2. Ваш оператор while будет ложным, поэтому никогда не будет отображаться прочитанное, а также если он прочитал только 1 строку, если это не EOF, в результате чего вы видеть.