【问题标题】:Simple binary File I/O problem with cstdio(c++)cstdio(c++) 的简单二进制文件 I/O 问题
【发布时间】:2010-06-13 09:38:13
【问题描述】:

下面的 c++ 程序无法读取文件。我知道使用 cstdio 不是一个好习惯,但我已经习惯了它应该可以工作。

$ ls -l l.uyvy

-rw-r--r-- 1 atilla atilla 614400 2010-04-24 18:11 l.uyvy

$ ./a.out l.uyvy

从 614400 中读取 0 个字节,可能是错误的文件

代码:

#include<cstdio>
int main(int argc, char* argv[])
{
    FILE *fp;

    if(argc<2)
    {
            printf("usage: %s <input>\n",argv[0]);
            return 1;
    }

    fp=fopen(argv[1],"rb");
    if(!fp)
    {
            printf("erör, cannot open %s for reading\n",argv[1]);
            return -1;
    }
    int bytes_read=fread(imgdata,1,2*IMAGE_SIZE,fp); //2bytes per pixel
    fclose(fp);
    if(bytes_read < 2*IMAGE_SIZE)
    {
            printf("Read %d bytes out of %d, possibly wrong file\n",
                 bytes_read, 2*IMAGE_SIZE);
            return -1;
    }
    return 0;
}

【问题讨论】:

    标签: c++ file-io stdio fread


    【解决方案1】:

    你已经把 size 和 nmemb 的参数放在前面了

    http://www.manpagez.com/man/3/fread/

    试试吧,

    int bytes_read = fread (imgdata, 2*IMAGE_SIZE, 1, fp);
    

    此外,您还没有提供 imgdata 缓冲区的声明,您需要确保缓冲区足够大 - 或者已正确分配。

    【讨论】:

      【解决方案2】:

      我通过初始化指针解决了这个问题。有趣的是,当您尝试读取未初始化的指针时,读取失败而不是给出段错误,这令人困惑。

      【讨论】:

      • 一旦你知道你必须提供一个缓冲区,这就不那么令人困惑了,fread 不会为你创建它。这实际上是一件好事,因为您真的不希望为每个文件操作分配一个新缓冲区。很多时候,您可以一次又一次地重复使用相同的缓冲区。 (想想性能!)——作为最后的提示,在你的情况下,确保不要将 imgdata 初始化为固定大小的缓冲区。您应该根据您正在阅读的文件的大小对其进行初始化。您可以通过调用fseek(fp, 0, SEEK_END);long fileSize = ftell(fp); 来获取文件大小
      猜你喜欢
      • 2011-09-20
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2018-06-29
      相关资源
      最近更新 更多