2

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

#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);
}
4

3 回答 3

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);
于 2010-07-13T03:41:30.330 回答
0

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

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

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

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

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

这两个例子就像从网站或图书馆请求文件的一部分——它们不会为你撕掉一页,你得到整个文件,你必须翻到你想要的。

于 2010-07-13T03:13:36.073 回答
0

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

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

于 2010-07-13T03:16:07.753 回答