C++ 如何使用fread正确缓冲行
出于某种原因(速度和…),我想对IO使用C++ 如何使用fread正确缓冲行,c++,io,fread,fseek,seekg,C++,Io,Fread,Fseek,Seekg,出于某种原因(速度和…),我想对IO使用fread()。我有一个不同大小的文件行。通过使用以下代码: while( !EOF ){ fread(buffer,500MB,1,fileName); // process buffer } 最后一行可能读不完整,我们必须在下一次试验中再次读取最后一行,那么如何强制fread()从最后一行开始继续 或者,如果可能,如何强制fread()读取超过500MB的数据,直到达到\n或其他特定字符 谢谢大家 Ameer.假设在pos位置反向找到一个\
fread()
。我有一个不同大小的文件行。通过使用以下代码:
while( !EOF ){
fread(buffer,500MB,1,fileName);
// process buffer
}
最后一行可能读不完整,我们必须在下一次试验中再次读取最后一行,那么如何强制fread()
从最后一行开始继续
或者,如果可能,如何强制fread()
读取超过500MB的数据,直到达到\n或其他特定字符
谢谢大家
Ameer.假设在
pos
位置反向找到一个\n
字符的缓冲区
,则要回滚到缓冲区长度减去该pos
。调用此步骤
您可以使用fseek
将文件指针向后移动这么多:
int fseek( FILE *stream, long offset, int origin );
就你而言
int ret = fseek(stream, -step, SEEK_END);
这将涉及到重新读取部分文件,以及相当多的跳跃-注释建议了可能更快的替代方法。如果您想要行,为什么不使用
fgets()
?fseek()
与此有什么关系?或者seekg()
?您可能需要分块阅读@EJP,因为我想将一大块文件读入ram,然后解析它。对于大文件,它将比使用fgets()逐行读取快。因为IO访问较少。。。现在我需要一个函数来告诉fread改变next的位置retrieval@doctorlove您提供的链接手动执行,它会找到缓冲区中的最后一个\n并将剩余的复制到下一个缓冲区的开头,这对我不合适,我需要一种方法来告诉fread更改读取位置,例如,通过查找最后一个\n我们可以计算需要再次读取的字节数,告诉fread()向后返回一些字节并读取…对于大型文件,它将比使用fgets()逐行读取快。因为IO访问量较少,所以不会。如果要使用FILE*
-类型函数,则会缓冲fread()
/fgets()
和使用文件*
的其他函数。请参阅,然后使用fgets()
或读取行。这样,我们将只重新读取一些字节,与读取一些兆字节相比,这是可以原谅的,这很好,感谢您的回答