C从此测试文件中读取输入并测试EOF的最佳方法

时间:2013-11-15 21:13:10

标签: c io eof

嘿大家我对C编程语言都很陌生,我试图从包含这些信息的简单.txt文件中读取:

  13 11 2011 13 10 00 GS452 45 20
  13 11 2011 15 14 23 EI597 60 30
  13 11 2011 15 34 35 EI600 20 15

目前我正在使用fscaf读取整行,然后将它们存储在我的结构中的正确变量中。我在网上看了一下,看起来检查EOF并不像使用fscanf一样直接,因为它返回了读取的“项目”数量。

使用我的以下代码和上述文件:

1)这是从正确的位置读取和存储文件信息的最佳方式

2)检查EOF的最佳方法,使其停止,文件结束/不读取空文件。

标题文件:

  #ifndef MAYDAY_STRUCT_H
  #define   MAYDAY_STRUCT_H

  #ifdef    __cplusplus
   extern "C" {
   #endif

typedef struct {
    /* unsigned because these values cannot be negative*/

    unsigned int day;
    unsigned int month;
    unsigned int year;
    unsigned int hour;
    unsigned int mins;
    unsigned int secs;
    char ais[5];
    unsigned int l_boat_time;
    unsigned int heli_time;


} mayday_call;

void read_may_day_file();

#ifdef  __cplusplus
}

的main.c

  #include <stdio.h>
  #include <stdlib.h>
  #include "mayday_struct.h"


 int main(int argc, char** argv) {


read_may_day_file();


return (EXIT_SUCCESS);
 }

void read_may_day_file() {

char locof[30];
char eofTest;
mayday_call mday;



printf("please enter the location of the input file \n");
scanf("%s", locof);

FILE *fp;
fp = fopen(locof, "r");


if (fp) {



        fscanf(fp, "%d %d %d %d %d %d %s %d %d", &mday.day, &mday.month, &mday.year, &mday.hour, &mday.mins, &mday.secs, mday.ais, &mday.l_boat_time, &mday.heli_time);


        printf("reading file mayday_1.txt \n"
                "day %d \n"
                "month %d \n"
                "yr %d \n"
                "hour % d\n"
                "mins %d \n"
                "sec %d \n"
                "ais %s \n"
                "lBoattime %d\n"
                "helitime %d \n", mday.day, mday.month,
                mday.year, mday.hour, mday.mins, mday.secs, mday.ais, mday.l_boat_time, mday.heli_time);

        fclose(fp);
    }

}

1 个答案:

答案 0 :(得分:0)

所以我建议使用fgets它将逐行从文件中读取,并在没有任何内容可读时返回NULL。如果您的案例中的所有内容都在同一行,我可能会使用fscanf,但您也可以使用strtok并读取整行,然后使用strtok

请点击此处了解更多信息:http://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

如果您希望使用fscanf,则表示它会返回已读取的金额,因此如果没有读取任何内容,则表示您已到达文件的末尾。

不要忘记你还必须打开你想要阅读的文件,并在完成后关闭它们。