【问题标题】:C best way to read input from this test file and test for EOF从此测试文件中读取输入并测试 EOF 的 C 最佳方法
【发布时间】:2013-11-15 21:13:09
【问题描述】:

大家好,我对 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);
    }

}

【问题讨论】:

    标签: c io eof


    【解决方案1】:

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

    在这里查看更多信息:http://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

    如果您要使用 fscanf,您是说它返回已读取的数量,因此如果未读取任何内容,则说明您已到达文件末尾。

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

    【讨论】:

    • 我看了看,但我不确定如何将信息从 fgets 传输,因为它将信息存储在数组中到我的变量中。正如我所说,我是 C 的新手,但它不会将数字 11 读为 1 1 吗? (2个单独的1个字符)
    • @chrisedwards 据我所知...它会读取整行,然后如果您使用 strtok 并将分隔符设置为空格(我假设每个数字都是分开的) by) 然后您可以使用atoistrtol 将该字符串转换为int。
    • 另外,如果您使用的是fscanf,我想我会这样做,请设置一个while 循环,上面写着while(fscanf(...) != EOF),它将继续阅读,直到没有任何内容可供阅读。
    • @mesales 所以在 scanf(...) 我会把我的正常 scanf 行放在 fscaf("%d %d %d ......" , ......) 并确保其大于 0?这基本上是说确保读取变量的数量大于0?我使用 Java,所以 C 现在让我有点困惑:L
    • @chrisedwards 是的,我必须做同样的转换(从 java 到 C),起初有点不知所措,但它变得更容易了。我犯了一个错误,它应该是fscanf,它必须> = 0,因为它可以在读取内容的同时返回0,但对于你的情况,你可以说while(fscanf(..) == #ofStuffReadIn)...你也可以直接做!=EOF
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2015-10-01
    • 2016-11-12
    • 2020-05-21
    相关资源
    最近更新 更多