用块-c ++读取文本文件

时间:2014-07-07 15:43:08

标签: c++ file-io large-files

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和高效率从块/块中读取文件中的数据?

2 个答案:

答案 0 :(得分:1)

如果您正在考虑阅读大量数据,那么您将使用一种称为缓冲的技术。但是,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的缓冲区,因为你是第一个选择。

答案 1 :(得分:0)

当且仅当文本行的长度相同时,您只需使用std::istream::read();读取文件即可。
要读取的块的大小为:

block_size = text_line_length * number_of_text_lines;  

如果你足够勇敢地处理更多的复杂性或者你的文本行不等长,你可以在向量中读取任意长度的字符并处理向量中的文本。

当文本行溢出块时,复杂性开始发挥作用。考虑处理块的末尾只有部分句子可用的情况。