string lineValue;
    ifstream myFile("file.txt");
    if (myFile.is_open()) {

        //getline(myFile, lineValue);
        //cout<<lineValue;

        while (getline(myFile, lineValue)) {
            cout << lineValue << '\n';
        }
        myFile.close();
    }
    else cout << "Unable to open file";


txt文件格式是这样的

0   1
1   2
2   3
3   4
4   5
5   5
6   6
7   7
8   8
9   9


上面的代码是逐行从文本文件中读取数据,但是文本文件的大小非常大(10GB)。
那么,如何以更少的I / O高效地从文件中以块/块的形式读取数据?

最佳答案

如果您打算读取大块数据,那么您将使用一种称为缓冲的技术。但是,如果ifstream已经提供了缓冲,那么我的第一步将是查看是否可以让ifstream为您完成这项工作。

我将在ifstream中设置一个比默认缓冲区大得多的缓冲区。就像是

const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);

std::ifstream is;
is.rdbuf()->pubsetbuf(buffer.get(), BUFSIZE);
is.open(filename.c_str());
const int LINESIZE = 256;
char line[LINESIZE];
if (is) {
    for (;;) {
        is.getline(line, LINESIZE);
        // check for errors and do other work here, (and end loop at some point!)
    }
}
is.close();


确保缓冲区与使用它的ifstream对象一样长。

如果发现速度仍然不够,则可以尝试使用ifstream :: read读取数据块。无法保证会更快,您必须花时间比较这些选项。您可以使用ifstream :: read这样的内容。

const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);

is.read(buffer.get(), BUFSIZE);


您必须小心编写代码以调用ifstream.read小心处理一个事实,即输入的“行”可能会分成连续的块(甚至取决于两个以上的块,具体取决于您的数据和缓冲区大小) )。这就是为什么要优先选择ifstream的缓冲区。

关于c++ - 在块中读取文本文件-C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24614541/

10-16 15:15