Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ C++;逐行阅读文本,需要节省速度/效率_C++ - Fatal编程技术网

C++ C++;逐行阅读文本,需要节省速度/效率

C++ C++;逐行阅读文本,需要节省速度/效率,c++,C++,我有一系列大型文本文件(10-100行,数千行),我想逐行解析它们。这样做的目的是检查行是否有特定的单词/字符/短语,如果有,现在就记录到辅助文件中 到目前为止,我使用的代码是: ifstream infile1("c:/test/test.txt"); while (getline(infile1, line)) { if (line.empty()) continue; if (line.find("mystring") != std::string::npos) {

我有一系列大型文本文件(10-100行,数千行),我想逐行解析它们。这样做的目的是检查行是否有特定的单词/字符/短语,如果有,现在就记录到辅助文件中

到目前为止,我使用的代码是:

ifstream infile1("c:/test/test.txt");
while (getline(infile1, line)) {
    if (line.empty()) continue;
    if (line.find("mystring") != std::string::npos) {
        outfile1 << line << '\n';
    }
}
ifstreaminfile1(“c:/test/test.txt”);
while(getline(infile1,line)){
如果(line.empty())继续;
if(line.find(“mystring”)!=std::string::npos){

outfile1当您使用
ifstream
读取和处理非常大的文件时,必须增加使用的默认缓冲区大小(通常为512字节)

最佳缓冲区大小取决于您的需要,但作为提示,您可以使用文件的分区块大小来读取/写入。要了解这些信息,您可以使用许多工具甚至代码

Windows中的示例:

fsutil fsinfo ntfsinfo c:
现在,您必须为
ifstream
创建一个新的缓冲区,如下所示:

size_t newBufferSize = 4 * 1024; // 4K
char * newBuffer = new char[newBufferSize];
ifstream infile1;
infile1.rdbuf()->pubsetbuf(newBuffer, newBufferSize);
infile1.open("c:/test/test.txt");
while (getline(infile1, line)) {
    /* ... */
}
delete newBuffer;
对输出流执行同样的操作,不要忘记在打开文件之前设置新的缓冲区,否则它可能无法工作

您可以使用值来找到最适合您的尺码


您会注意到其中的差异。

C风格的I/O函数比fstream快得多。
您可以使用fgets/fputs读取/写入每一行文本。

您是否进行了优化编译?我的2美分…从文件中读取每一行会降低速度。尝试使用系统调用(希望您使用的是linux)。1.使用mmap(或)2.使用fstat或stat来了解文件大小。动态分配该大小的内存。一次性读取整个文件,然后执行该过程。该循环中最昂贵的事情是查找操作,我认为这是对“mystring”行的线性搜索。找到更好的方法来确定是否匹配将节省大量时间。IO(读取数据,写入第二个文件)是您的下一个大的时间成本,最小化发出的读/写系统调用的数量将减少在循环中花费的时间。请仔细阅读ifstream缓冲,让自己相信它是按您认为的方式工作的。@dailygrind VS中的默认配置是debug…将其切换到release并重新配置您可以在l中读取文件arge块(例如4kB),然后搜索针,然后搜索周围的行尾。这也是
grep
所做的。