【问题标题】:C++ reading text file by blocksC ++按块读取文本文件
【发布时间】:2012-09-13 07:11:02
【问题描述】:

我在 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。分块阅读确实有意义。这段代码很短,但我将它存储在循环缓冲区中。

【问题讨论】:

  • 您的意思是普通的 C I/O 在 C++ 中不适合您? int fd = open("file", O_RDONLY); if (fd &gt;=0) { for (ssize_t rd=0; (rd=read(fd, buf, sizeof(buf))) &gt; 0;) {do something;} close(fd); }
  • 有人告诉我,如果我有选择,不推荐使用 C 和 C++ 代码
  • 我猜你想追加到向量,而不是每次循环都覆盖其中的内容?
  • 顺便说一句,fstream 是为 istream(和 ostream)派生的,并支持 read(char_type *, streamsize)(和 write(const char_type *, streamsize))。所以只需将read 输入buffer 就可以了
  • @iwtu:你被告知错了,但这无关紧要。使用系统调用是一个很好的 C++ 代码:)

标签: c++ text-files ifstream


【解决方案1】:

您应该可以执行以下操作

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

保证向量中的元素是连续存储的,所以这应该有效 - 但您应该确保向量永远不会为空。我最近在这里问了一个类似的问题——查看标准Can I call functions that take an array/pointer argument using a std::vector instead?中的具体细节的答案

【讨论】:

    【解决方案2】:
    std::ifstream fin("index.xml");
    std::stringstream buffer;
    buffer << fin.rdbuf();
    std::string result = buffer.str();
    

    正是您需要的。

    【讨论】:

    • 我没有看到任何数据块。我假设它会读取整个输入直到结束。
    【解决方案3】:

    最近,我遇到了同样的问题。我使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 2012-03-24
      • 2021-03-10
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多