Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用fread正确缓冲行_C++_Io_Fread_Fseek_Seekg - Fatal编程技术网

C++ 如何使用fread正确缓冲行

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位置反向找到一个\

出于某种原因(速度和…),我想对IO使用
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()
或读取行。这样,我们将只重新读取一些字节,与读取一些兆字节相比,这是可以原谅的,这很好,感谢您的回答