在Mac上的Xcode中使用fopen(fileName,“wb”)后无法访问我的二进制文件

时间:2015-11-16 13:38:06

标签: c xcode macos fopen

FILE* inFile = fopen(inF, "rb");
if (inFile == NULL) {
    printf("Invalid input!\n");
    exit(EXIT_FAILURE);
}

char* bigBuffer;
char* nextChar = (char*) malloc(sizeof(char));
unsigned long i = 0;
unsigned long j;
while ((j = fread(nextChar, sizeof(char), 1, inFile)) == 1) {
    i += j;
}
bigBuffer = malloc(i * sizeof(char));
fread(bigBuffer, sizeof(char), i, inFile);
fclose(inFile);
printf("%s\n", outF);
FILE* outFile = fopen(outF, "wb");
//if (outFile == NULL)
    //printf("null\n");
j = fwrite(bigBuffer, sizeof(char), i, outFile);
printf("%lu\n", j);
fclose(outFile);
free (bigBuffer);
free (nextChar);

我正在尝试在wb模式下使用fopen编写二进制文件。运行我的程序后,在适当的位置创建一个正确名称的文件,但我无法打开或阅读它。当我尝试打开它时,会弹出一条消息,说“无法打开....”此外,文件本身的名称在Finder中没有正确格式化(我在Mac上)。这个名字被抬高并切断了一点。肯定看起来文件有问题。我尝试在w模式下使用fopen制作一个常规文件,并且效果很好。因此,我很确定在使用wb模式编写二进制文件时,我只是做错了。有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:2)

主要问题:

  • 您在阅读之前没有寻找文件的开头,因此您对fread的调用将无法读取整个文件

变化:

bigBuffer = malloc(i * sizeof(char));
fread(bigBuffer, sizeof(char), i, inFile);

为:

bigBuffer = malloc(i);              // allocate buffer
rewind(inFile);                     // reset file pointer to start of file
fread(bigBuffer, 1, i, inFile);     // read entire file

附加说明:

    根据定义,
  • sizeof(char)为1,因此是多余的
  • 你不应该cast the result of malloc in C
  • 您应该对可能失败的任何呼叫添加错误检查,尤其是I / O呼叫
  • malloc - 使用单个字符效率低下 - 只需使用本地变量
  • 一次读取一个文件以确定其长度是非常低效的

答案 1 :(得分:0)

wb中打开的文件被截断为0长度。用于同时读/写模式或加法模式rb +,a。