为什么我的程序在读取txt文件之前停止了?

时间:2015-03-28 15:15:03

标签: c visual-studio-2010 file printf fopen

我的代码在读取文件之前一直关闭,我在关闭时发表评论。有谁知道为什么它不会工作?我把它展示给了我的讲师,但她无法弄明白,然后她不得不离开,所以我想知道这里是否有人可以解决这个问题!

#include <stdio.h>
#include <stdlib.h>
#define RESULT_MAX = 100;
#define RESULT_MIN = 0;

int main() 
{

    int studentId;
    char firstName[20];
    char lastName[20];
    int result;

    FILE *fPtr;

    if ((fPtr = fopen("student.txt", "w")) == NULL)
    {
            printf("File could not be opened\n");
            //exit(0);
    }
    else
    {
        printf("Enter the Id, first name, last name and result\n");
        scanf("%d %s %s %d", &studentId, firstName, lastName, &result);
        while(!feof(stdin) )
        {
            fprintf(fPtr, "%d %s %s %d\n", studentId, firstName, lastName, result);
            scanf("%d %s %s %d", &studentId, firstName, lastName, &result);
        }

        fclose(fPtr);
    }//else end

// MY PROGRAM ENDS HERE AND WONT CONTINUE!


    if ((fPtr = fopen("student.txt", "r")) == NULL)
    {
            printf("File could not be opened\n");
            //exit(0);
    }
    else
    {
        printf("Id, first name, last name, result ");
        fscanf(fPtr, "%d %s %s %d", &studentId, firstName, lastName, &result);

        while(!feof(fPtr) )
        {
            printf("%d %s %s %d \n", studentId, firstName, lastName, result);
            fscanf(fPtr, "%d %s %s %d", &studentId, firstName, lastName, &result);

        }//end while
    fclose( fPtr );
    }//end if




}

1 个答案:

答案 0 :(得分:0)

the problem is actually the line: 'while(!feof(stdin) )'  
because feof() only becomes valid when the program 
tries to read past the end of the 'stdin' file.   

This is something that cannot be accomplished

suggest 
modifying the program to:
1) read into a local buffer[] array, in a loop, 
2) using fgets() as the loop control
3) have a leading 'q' (or similar) as an indication of having read all input
4) output a prompt for every input line
5) if going to parse the fields, parse them using 
   strtok()/atoi() strncpy() strncpy() atoi()
   or perhaps
   sscanf()
6) check first char of input buffer[] for the end marker (the 'q' above)
   to exit the input loop before parsing

there is a similar problem with the 
loop reading the file
I.E. do not use feof() for loop control
    rather use fgets()

to differentiate each line of input written to the file, modify
the fprintf(fPtr, ... ) format string to include a trailing '\n'