3

我真的没有在 google 找到满意的答案,而且 C++ 中的 I/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”。这不奇怪吗?我可以做得更好吗?我可以将数据读入向量而不是字符数组吗?直接读入vector合适吗?

感谢您的回答。

PS。分块阅读确实有意义。这段代码很短,但我将它存储在循环缓冲区中。

4

3 回答 3

4

您应该可以执行以下操作

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

保证向量中的元素是连续存储的,所以这应该有效 - 但您应该确保向量永远不会为空。我最近在这里问了一个类似的问题 - 从标准中查看具体细节的答案我可以使用 std::vector 来调用采用数组/指针参数的函数吗?

于 2012-09-13T07:20:01.733 回答
0
std::ifstream fin("index.xml");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();

正是你需要的。

于 2012-09-13T07:20:55.587 回答
0

最近,我遇到了同样的问题。我使用 read 和 gcount 函数来解决它。它运作良好。这是代码。

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;
}
于 2013-07-02T07:28:24.847 回答