c语言 - 在 Mac 上的 Xcode 中使用 fopen(文件名,"wb")后无法访问我的二进制文件


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("%sn", outF);
FILE* outFile = fopen(outF, "wb");
//if (outFile == NULL)
    //printf("nulln");
j = fwrite(bigBuffer, sizeof(char), i, outFile);
printf("%lun", j);
fclose(outFile);
free (bigBuffer);
free (nextChar);

我正在尝试在 wb 模式下使用 fopen 编写二进制文件。运行我的程序后,在正确的位置制作了一个正确名称的文件,但我就是无法打开或读取它。当我尝试打开它时,弹出一条消息说"无法打开..."此外,文件本身的名称在 Finder 中格式不正确(我在 Mac 上(。名字被抬高了,被切断了一点。看起来文件肯定有问题。我尝试在 w 模式下使用 fopen 制作一个常规文件,效果很好。所以我很确定在使用 wb 模式编写二进制文件时我只是做错了什么。谁能帮忙?谢谢。

主要问题:

  • 您在读取之前没有寻找文件的开头,因此调用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,因此是多余的
  • 你不应该在 C 中转换 malloc 的结果
  • 应向任何可能失败的调用添加错误检查,尤其是 I/O 调用
  • malloc -ing 单个字符效率低下 - 只需使用局部变量
  • 一次
  • 读取一个字符的文件以确定其长度效率非常低

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

最新更新