【问题标题】:Read and process a text file line by line in C [duplicate]在C中逐行读取和处理文本文件[重复]
【发布时间】:2014-01-15 04:50:04
【问题描述】:

我有一个如下所示的文本文件:

1;Einstein;Albert;3914-1948-4
2;Newton;Isaac;1941-5525-2
...

还有这样的结构

typedef struct {
int Nr;
char FName[30];
char LName[30];
char ID[12];
} student;

我有一个函数,它从上面的文件和一个结构中获取一个结构类似于一行的字符串,并将该行中的数据保存在结构中。

现在我必须从文件中读取一行,用我的函数处理它并转到下一行。

我会在一个循环中执行此操作,该循环会从一行跳到另一行,并为每一行创建一个新的变量类型 student。

但我不知道该怎么做。 fgets 只允许你读一行,我看不到跳到下一行的方法。

有没有一种不太复杂的方法来做到这一点?

【问题讨论】:

  • 每次调用fgets()都会返回一个行。要阅读下一行,请再次致电fgets()。

标签: c arrays struct


【解决方案1】:

你可以这样做:

    str char *str;
    str = fgets(fptr);
    while (str != EOF)
    {
        printf ("%s", str);
        str  = fgets(fptr);
    }

【讨论】:

    【解决方案2】:

    每次调用 fgets 都会返回一个新行,直到 EOF(即“文件结束”)。

    见:fgets

    有关使用fgets 的读取循环的简明示例,请参阅:

    fgets - get a string from a stream

    但是,如果您不能确定分配足够长的缓冲区来容纳一行,通常最好使用fgetc 一次读取每个字符——不用担心,文件 I/ O 仍然是缓冲的,一次不读取一个字符 - 并在您进行时将文本组装成标记,而不是处理比您提供的任何缓冲区更长的行,这可能需要您处理在一个填充的缓冲区和下一个。

    【讨论】:

    • 但它说:“在 EOF 或换行符后停止读取。如果读取换行符,则将其存储到缓冲区中。终止的空字节 (aq\0aq) 存储在最后一个字符之后在缓冲区中。”所以它会在第一行之后停止阅读
    • 好了,EOF 没问题,大功告成。但在换行的情况下,对fgets 的下一次调用将读取换行之后的字符——即下一行。
    • @user3004619 这是一个电话..如果你再次调用它,你会得到另一行,依此类推,直到 EOF
    猜你喜欢
    • 2015-05-19
    • 2020-02-21
    • 2023-03-27
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多