从文件读取和打印但卡在循环C中

时间:2016-04-28 03:27:06

标签: c infinite-loop scanf

我试图从文件中读取一些数据然后将其打印出来但我的代码只是读取第一个内容然后陷入无限循环(在while循环中)。我究竟做错了什么? 我的输出只是学生:Abby GPA:3 我正在使用Visual Studio 2012。 我只是按照我的书中的一个例子。

//My data is Abbie 3.4 Oakley 3.5 Sylvia 3.6 Uwe 3.7 Ken 3.8 Aaron 3.9 Fabien 4 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{    
    unsigned int GPA;//GPA
    char student[10];//Student
    FILE * cfPter;
    //Check if file opened
        if((cfPter = fopen("data.txt", "r")) ==NULL)
        {
                puts("File could not be opened");
            }
        //Read Contents
        else
            {
                puts("Contents of file:\n");
                fscanf(cfPter,"%s %f ", student, &GPA);
            }
        //While not at end Print the contents read
        while(!feof(cfPter))
        {
            printf("Student: %s GPA: %f",student,GPA);
            fscanf(cfPter, "%s %f", student, GPA);
            //system("pause");
        }

    fclose(cfPter);
    system("pause");
} //end main    

3 个答案:

答案 0 :(得分:0)

你到了那里,但是一些调整可以让生活更轻松。首先,如果您的fopen失败,请通过提示输入其他文件名来处理失败,或者只是returnexit)。这样,其余代码就不会包含在else语句中。

接下来,我提供了while (!feof(file))始终错误的原因(从文件中读取字符数据时)。当您阅读输入时,验证您收到的输入 - 这就是您真正需要做的所有事情。查看fscanf来电的回复。

考虑到这一点,你可以做类似以下的事情:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void) {

    float GPA = 0.0;        /* GPA     */
    char student[10] = "";  /* Student */
    FILE *cfPter = NULL;

    /* open file/validate file is open */
    if (!(cfPter = fopen ("data.txt", "r"))) {
        fprintf (stderr, "error: file open failed 'data.txt'.\n");
        return 1;
    }

    /* Read Contents */
    while (fscanf (cfPter, " %9s %f", student, &GPA) == 2)
        printf ("Student: %-10s GPA: %.2f\n", student, GPA);

    fclose (cfPter);
    return 0;                   /* main is type 'int' and returns a value */
}

示例data.txt

$ cat data.txt
Abbie 3.4 Oakley 3.5 Sylvia 3.6 Uwe 3.7 Ken 3.8 Aaron 3.9 Fabien 4

示例使用/输出

$ ./bin/feofissue
Student: Abbie      GPA: 3.40
Student: Oakley     GPA: 3.50
Student: Sylvia     GPA: 3.60
Student: Uwe        GPA: 3.70
Student: Ken        GPA: 3.80
Student: Aaron      GPA: 3.90
Student: Fabien     GPA: 4.00

注意,而MS会让您在很久以前使用void mainmain被定义为类型int并返回一个值。)

另外,对于pause,您通常会#include <conio.h>在Windows上并致电getch();以阻止终端窗口关闭。你可以尝试任何一种方式。如果您有疑问,请告诉我。

答案 1 :(得分:0)

我也在this工作,有人告诉我尝试使用strcmp()逐行读取文件,直到找到你要查找的行为止?我正在研究这个想法,但在此之后我们还没弄清楚如何能够阅读GPA。

答案 2 :(得分:0)

一个避免在fscanf中读取不同类型日期的计划是始终将char数据读入本地char数组。然后使用sscanf将其转换为您需要的数据类型。这允许您在fscanf和sscanf之间添加数据检查。这将避免fscanf什么都不读(旋转轮),永远不会去eof