使用C中的fscanf()读取文件

时间:2010-07-28 10:06:57

标签: c file readfile scanf

我需要从文件中读取和打印数据 我写下了这个程序,

#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

当我运行代码时,它会打印

  

无法阅读。

请帮我找出问题所在。

4 个答案:

答案 0 :(得分:26)

首先,您要测试fp两次。所以printf("Error Reading File\n");永远不会被执行。

然后,fscanf的输出应该等于2,因为您正在读取两个值。

答案 1 :(得分:12)

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;
}

答案 2 :(得分:3)

在您的代码中:

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

为什么1而不是2? scanf函数返回读取的对象数。

答案 3 :(得分:1)

fscanf将处理2个参数,从而返回2.您的while语句将为false,因此从不显示已读取的内容,加上因为它只读取1行,如果不是EOF,则导致你看到什么了。