C++比fgetc更好的东西

C++ Something better than fgetc?

本文关键字:更好 fgetc C++      更新时间:2023-10-16

我有一个巨大的文件,我正在用fopen&循环中的fgetc。

用fopen中的"rb"标志读取整个文件大约需要6秒,文件中大约有25k行。

我在想;有什么比fgetc更快的方法?先加载char*数组中的所有内容会更好吗?strcpy更好吗?

  • 注意,如果是fgetc的方式,或者如果我至少能够在数组中逐个字符地获取,那就更好了。

  • 有什么比fgetc更好的方法?

好的fgetc已经进行了相当多的优化,因为它使用了fopen的底层缓冲。只需为每个字符调用一个函数(而不是系统调用)。您可以尝试使用setbuffer:来增加缓冲区大小(正如您所说的,您正在读取巨大的文件)

#define SIZE 65536
// or use even greater size if appropriate ...
char buffer[SIZE];
fd = fopen(...);
setbuffer(fd, buffer, SIZE);

或者,你需要每个字符读取一个字符吗?

如果文件是一个文本文件,它可能由大小合理的行组成。然后,您可以尝试逐行读取,例如使用std::getline(或者,在C中,getline(3))

如果您在Posix系统(例如Linux)上,则可以使用底层系统调用(2),如read(2)或mmap(2)。确保有足够大的缓冲区,例如16K字节或64K字节。

顺便说一句,如果在Linux上,尝试time wc yourbigfile,它应该会让您了解读取文件实际需要的时间的下限。请记住,有一个文件系统缓存:请参阅http://linuxatemyram.com/了解更多信息。

在我的Linux桌面系统wc上,一个6M字节、100Klines的文件需要大约0.1秒的实时时间

也许可以阅读高级Linux编程,至少如果您在Posix系统上运行程序的话。

BTW,您的问题是操作系统,也许是文件系统特定的

我的代码的整个问题是,每次我想"返回"一个字符时,我都会使用fget_pos和fset_pos,这大大提高了速度!