逐行读取数组中的文件

时间:2010-07-13 03:10:29

标签: c pointers file-io fseek

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

如果你想跳到一个特定的行,比如说5,那么为了读取第5行,读4行并且不做任何操作,他们读下一行并用它做点什么。

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

另外:注意你告诉fgets为你读取的字节数(10)与你将该行放入(30)的数组的大小相同 - 所以现在不是这样的

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

这两个例子都是从网站或图书馆请求文档的一部分 - 他们不会为你撕掉一个页面,你得到整个文档,你必须翻转你想要的东西

答案 2 :(得分:0)

不喜欢这个没有。有一个名为fseek的函数可以将您带到文件中的其他位置。

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