在 Mac 上的 Xcode 中使用 fopen(fileName, "wb") 后无法访问我的二进制文件
Can't access my binary file after using fopen(fileName, "wb") in Xcode on Mac
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 编写二进制文件。在 运行 我的程序之后,在适当的地方创建了一个适当名称的文件,但我无法打开或读取它。当我尝试打开它时,弹出一条消息说 "Can't open...." 此外,文件名称本身在 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,因此多余
- 你不应该cast the result of malloc in C
- 您应该对任何可能失败的调用添加错误检查,尤其是 I/O 调用
malloc
-ing 单个字符效率低下 - 只需使用局部变量
- 一次读取文件一个字符以确定其长度效率非常低
以wb开头的文件被截断为0长度。用于同步读/写模式或加法模式 rb+,a.
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 编写二进制文件。在 运行 我的程序之后,在适当的地方创建了一个适当名称的文件,但我无法打开或读取它。当我尝试打开它时,弹出一条消息说 "Can't open...." 此外,文件名称本身在 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,因此多余- 你不应该cast the result of malloc in C
- 您应该对任何可能失败的调用添加错误检查,尤其是 I/O 调用
malloc
-ing 单个字符效率低下 - 只需使用局部变量- 一次读取文件一个字符以确定其长度效率非常低
以wb开头的文件被截断为0长度。用于同步读/写模式或加法模式 rb+,a.