C ++的块读取文本文件(C++ reading text file by blocks)

2019-09-22 08:50发布

我还真没发现在谷歌一个满意的答复和I / C ++ o是有点棘手。 我想如果可能的阅读框的文本文件转换成一个载体。 唉,我无法弄清楚如何。 我什至不知道,如果我的无限循环将在所有的可能性休息,因为I / O是棘手的。 所以,我能想出的最好的办法是这样的:

char buffer[1025]; //let's say read by 1024 char block
buffer[1024] = '\0';
std::fstream fin("index.xml");
if (!fin) {
    std::cerr << "Unable to open file";        
} else {
    while (true) {          
        fin.read(buffer, 1024);
        std::cout << buffer;
        if (fin.eof())
            break;
    }

}

请注意,以“\ 0”第二行。 这难道不奇怪? 我可以做的更好的东西? 我可以读取数据到载体,而不是字符数组? 它是适当的,直接读入向量?

谢谢您的回答。

PS。 由大块阅读有感觉确实如此。 此代码是短暂的,但我将它存储在循环缓冲区。

Answer 1:

你应该罚款执行以下操作

 vector<char> buffer (1024,0);      // create vector of 1024 chars with value 0   
 fin.read(&buffer[0], buffer.size());

在矢量中的元素保证连续存储,所以这应该工作 - 但是你应该确保矢量是从来没有空。 我问过类似的问题,最近在这里-核对答案给从标准的具体细节我可以调用采取使用一个std ::向量不是数组/指针参数的功能呢?



Answer 2:

std::ifstream fin("index.xml");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();

正是你需要的。



Answer 3:

最近,我也遇到了同样的问题。 我用阅读和gcount的职能A anaylse来解决它。 它工作得很好。 下面是代码。

vector<string> ReadFileByBlocks(const char* filename)
{
    vector<string> vecstr;

    ifstream fin(filename, ios_base::in);
    if (fin.is_open())
    {
        char* buffer = new char[1024];
        while (fin.read(buffer, 1024))
        {
            string s(buffer);
            vecstr.push_back(s);
        }

       // if the bytes of the block are less than 1024,
       // use fin.gcount() calculate the number, put the va
       // into var s
       string s(buffer, fin.gcount());
       vecstr.push_back(s);

       delete[] buffer;
       fin.close();
   }
   else
   {
        cerr << "Cannot open file:" << filename << endl;
   }

   return vecstr;
}


文章来源: C++ reading text file by blocks