我正在尝试读取C语言中32个字节的二进制文件,但是在运行程序时,我不断收到“分段错误(代码已转储)”, 如果有人可以指出我哪里出了问题可以帮助我,那将是很好的。 我的代码如下:
int main()
{
char *binary = "/path/to/myfiles/program1.ijvm";
FILE *fp;
char buffer[32];
// Open read-only
fp = fopen(binary, "rb");
// Read 128 bytes into buffer
fread (buffer, sizeof(char), 32, fp);
return 0;
}
答案 0 :(得分:1)
这是因为路径。确保"/path/to/myfiles/program1.ijvm"
指向现有文件。
您应该始终检查fopen
的返回值。
\\Open read-only
fp = fopen(binary, "rb");
if(fp==NULL){
perror("problem opening the file");
exit(EXIT_FAILURE);
}
还请注意,您正在读取缓冲区中的32个字节,而不是注释中的128个字节。
答案 1 :(得分:1)
您必须检查fopen()
的返回结果。
我假设您在fread()
调用中遇到段错误,因为您的数据文件不存在或无法打开,并且您正在尝试使用NULL FILE结构。
请参阅以下安全代码:
#include <stdio.h>
#include <stdint.h>
#define SIZE_BUFFER 32
int main()
{
char *binary = "data.txt";
FILE *fp = NULL;
char buffer[SIZE_BUFFER];
// Open read-only
fp = fopen(binary, "rb");
// Read SIZE_BUFFER bytes into buffer
if( fp )
{
printf("Elements read %ld\n", fread (buffer, sizeof(char), SIZE_BUFFER, fp));
fclose(fp);
}
else
{
// Use perror() here to show a text description of what failed and why
perror("Unable to open file: ");
}
return 0;
}
当我执行此代码时,它不会崩溃,并且在打开文件时将打印读取的元素数,或者在无法打开文件时将显示“无法打开文件”。
如注释中所述,您还应该关闭正在退出的文件。您可以做的另一件事是:
FILE *fp = fopen(.....);
无需在两个单独的步骤中进行声明和分配。
答案 2 :(得分:0)
有两个可能的原因
fopen(3)
函数由于某种原因而失败,这意味着fp
为NULL,然后您尝试在fread(3)
中使用空指针。这可能会崩溃。 @OznOg已经给出了一个微妙的提示,可以朝这个方向前进。fopen
调用成功(即,调用fp
后fopen
不为NULL),由于您正在将32个字符读入变量{{ 1}},而binary
仅初始化了30个字符。