【问题标题】:Read file in array line by line逐行读取数组中的文件
【发布时间】:2010-07-13 03:10:28
【问题描述】:

您可以将数组的任何索引设置为起始索引,即从文件中读取的位置吗?我担心缓冲区可能会在此过程中损坏。

#include <stdio.h>

int main()
{
    FILE *f = fopen("C:\\dummy.txt", "rt");

    char lines[30]; //large enough array depending on file size

    fpos_t index = 0;

    while(fgets(&lines[index], 10, f)) //line limit is 10 characters
    {
        fgetpos (f, &index );
    }

    fclose(f);
}

【问题讨论】:

    标签: c pointers file-io fseek


    【解决方案1】:

    你可以,但由于你的代码试图读取文件的全部内容,你可以用 fread 更直接地做到这一点:

    char lines[30];
    
    // Will read as much of the file as can fit into lines:
    fread(lines, sizeof(*lines), sizeof(lines) / sizeof(*lines), f);
    

    也就是说,如果您真的想逐行阅读并安全地阅读,您应该将 fgets 行更改为:

    // As long as index < sizeof(lines), guaranteed not to overflow buffer
    fgets(&lines[index], sizeof(lines) - index, f);
    

    【讨论】:

      【解决方案2】:

      不是这样的。有一个名为 fseek 的函数可以将您带到文件中的不同位置。

      您的代码会将文件读入缓冲区的不同部分(而不是读取文件的不同部分)。

      【讨论】:

        【解决方案3】:

        lines[index] 是数组lines 的第索引字符。它的地址不是第 index 行。

        如果你想跳到特定的行,比如第 5 行,那么为了阅读第 5 行,阅读 4 行并且什么都不做,他们阅读下一行并用它做一些事情。

        如果您需要跳到文件中的特定 BYTE,那么您要使用 fseek()。

        另外:请注意,您告诉 fgets 为您读取的字节数 (10) 与您将行放入的数组的大小 (30) 相同 - 所以现在情况并非如此.

        如果您需要从该行中的某个字符开始读取该行的一部分,您仍然需要读取整行,然后只需选择从开头以外的某个位置开始使用它的一部分。

        这两个示例都类似于从网站或图书馆请求文档的一部分 - 它们不会为您撕下页面,您会得到整个文档,并且您必须翻到您想要的内容.

        【讨论】:

          猜你喜欢
          • 2015-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          相关资源
          最近更新 更多