【问题标题】:c++ reading from beginning of file to a specified bytec ++从文件开头读取到指定字节
【发布时间】:2013-04-04 23:08:40
【问题描述】:

尝试将文件从文件中的第一个字节读取到用户指定的字节。我需要逻辑上的帮助。例如,如果文件只有字母 a 到 z,我只想读取并显示前 10 个。这是我写的一段:

  char byte;
  inFile.seekg(0L,ios::beg);
  inFile.get(byte);
  cout << byte;

  for(int i = 0; i < num; i++);  //num is an int specified by the user.
  {
      inFile.seekg(1, ios::cur);
      inFile.get(byte);
      cout << byte;
  }

【问题讨论】:

  • 你有什么问题?代码有效吗?如果不是,有什么问题?
  • 您的问题可能是您不需要在每次读取后向前搜索 1 个字节。 get 电话已经做到了。您的代码可能每隔一个字节就跳过一次。此外,您读取的字节比您需要的多一个字节,因为除了循环之前的 get 之外,您的循环从 0 变为 num-1。
  • seek 适用于您不想从文件开头按顺序读取的情况。
  • 顺便说一句,您还应该考虑检查文件的结尾...您可以阅读:cplusplus.com/reference/ios/ios/eof
  • 是要跳过多个字节还是要搜索一个字节值?

标签: c++ seekg


【解决方案1】:

第一个问题 - for() 行末尾的分号:

    for(int i = 0; i < num; i++);
    {
        ...
    }

编译器看到的其实是这样的:

    for(int i = 0; i < num; i++) { /* do nothing num times */ }

    {
        // code that will only run once
    }

所以,去掉分号。

接下来,如果您只是连续读取字节,则无需在每个字节之间进行查找。只需调用get() 即可获得序列中的下一个字节。所以删除seekg() 调用。

最后一个问题——这个函数实际上调用了inFile.get(),总共调用了num + 1 次。第一次调用是在for 循环之前。然后在for 循环中,get() 被调用num 次(即 i = 0, 1, 2, 3 ... num-1)。您可以通过将for 循环计数器更改为(i = 1; i &lt; num; i++) 或在for 循环之前删除get() 调用来解决此问题。在下面的代码中我选择了第二种方式:

void run(int num, istream &inFile)
{
    char byte;

    for(int i = 0; i < num; i++)
    {
        inFile.get(byte);
        cout << byte;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多