从文件循环读取 - 无法使用feof或getc进入循环

时间:2014-05-18 21:11:54

标签: c file-io eof

所以这只是一个简单的文件循环读取,我似乎无法弄清楚出了什么问题。我已经尝试了很多方法,但我似乎无法通过循环。我已经尝试了很多方法(最初使用getc,但是使用getc,整个循环都会被忽略。

出于某种原因,它只是不适合我。下面显示的方式,程序一旦达到while条件就会冻结。也许有人可以解释为什么会这样,因为文件指针应该指向文件的开头。文件' input.txt'只是一个简单的数据列表,我应该读入一个结构,然后传递给另一个函数输入到我的数据结构。

然而,我似乎无法进入其他功能。花了几个小时试图解决这个问题的不同方法。我确信这是一个我没见过的明显解决方案。

void readWrite(char *inFile)
{
    FILE *fp;
    FILE *fpBin;
    char c;
    stuBucket temprec;
    long address;

    //open binary file to initialize hash file
    if ((fpBin = fopen(BINARYFILE, "w+b")) == NULL)
    {
        printf("Could not open binary file %s.\n", BINARYFILE);
        return;
    }
    fwrite(fpBin, sizeof(struct student), 50, fpBin); //Write entire hash table to disk
    if (fp = fopen(inFile, "r") == NULL)     //open text file to read in from
    {
        printf("Could not open input file %s.\n", inFile);
        return;
    }
    printf("Input File %s Open.\n", inFile);

下面的while循环中的问题

    while(!feof(fp))
    {
        printf("hello");
        fscanf(fp, "%d %s %s %f\n", temprec.stuID, temprec.lastName,
                                     temprec.firstName, &temprec.amount);
        writeRecord(temprec);
        insert(temprec, fpBin); //hash data to disk
        printf("insert done\n");
    }
    fclose(fp);
    fclose(fpBin);
}//end readFromFile

在被跳过时交替

c = getc(fp);
while(c != EOF)
{
    ungetc(c, fp);
    printf("hello");
    fscanf(fp, "%d %s %s %f\n", temprec.stuID, temprec.lastName,
                                 temprec.firstName, &temprec.amount);
    writeRecord(temprec);
    insert(temprec, fpBin); //hash data to disk
    printf("insert done\n");
    c = getc(fp);
}

input.txt的内容

6745 SMITH ANNA 7769.87
5675 JOHNSON SHEILA 23.91
1235 WILLIAMS JANE 93.12
2341 JONES BARBARA 74.23
8624 BROWN YELENA 56.75
9162 DAVIS SUSAN 902.34
7146 MILLER ALISON 8934.12
2328 WILSON ROYCE 123.09
1622 MOORE TONI 83.65
1832 TAYLOR JOAN 293.18
3271 GARCIA ROBERT 43.72
4717 MARTINEZ JHON 85.11
9345 ROBINSON ANDRE 15.67
1623 CLARK VICTOR 83.45
5673 HALL MARC 93.13
6275 ALLEN RAY 958.34
5392 HERNANDEZ MICHAEL 23.45

2 个答案:

答案 0 :(得分:2)

你的一个问题是:

if (fp = fopen(inFile, "r") == NULL)

它当然应该是:

if ((fp = fopen(inFile, "r")) == NULL)

然后匹配打开二进制文件的行。

答案 1 :(得分:1)

在这种情况下,fscanf可能会在文件末尾留下一些空格字符。始终检查fscanf成功读取的值:

if (fscanf(fp, "%d %s %s %d\n", ...) != 4) break;