首先,我是C的新手而不是编程;我在PHP中做了很多web开发。对于这个问题......
我有一个函数可以读取一系列二进制文件并输出内容,但sprintf()
的使用会影响后面的多维数组的内存分配。见下文:
FILE *fp;
for(int i = 1; i <= 16; i++) {
char format_1[] = "track_%d.bin";
char filename_1[sizeof format_1+100];
sprintf(filename_1,format_1,i);
printf("Filename: %s \n", filename_1);
fp = fopen(filename_1, "rb");
if(fp) {
fseek(fp, 0L, SEEK_END);
int sz = (ftell(fp) / 3) - 1;
fseek(fp, 0L, SEEK_SET);
printf("File size: %d\n", sz);
int nums[sz][3];
fread(nums,sizeof(int),sz * 3, fp);
for (int k = 0; k < sz; k++) {
printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]);
}
} else {
printf("Skipping \n");
}
fclose(fp);
}
我知道这是导致问题的sprintf()因为我将函数简化为:
printf("Please enter file number... \n");
scanf("%d%c", &num_file, &term);
printf("Please enter how many instances in this file... \n");
scanf("%d%c", &num_instance, &term);
int nums[num_instance][3];
char format_1[] = "track_%d.bin";
char filename_1[sizeof format_1+3];
sprintf(filename_1,format_1,num_file);
printf("Filename: %s \n", filename_1);
fp = fopen(filename_1, "rb");
fread(nums,sizeof(int),num_instance * 3, fp);
fclose(fp);
for (int k = 0; k < num_notes; k++) {
printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]);
}
当我在sprintf()上方移动nums声明时,只要我在sprintf()下面移动nums声明,它就可以正常工作(即使它刚好在它之上),输出如下所示:
Entry number: 0 = 71 with extra values 116 and 158
Entry number: 1 = -1073743712 with extra values -1073744240 and -1073744304
Entry number: 2 = -1073743896 with extra values 59983 and -1073744005
正如您从顶部代码段中看到的,我需要在nums
下面声明sprintf()
,因为我需要知道文件中的条目数。
编辑:我想如果我提到一个文件包含多维数组可能会有所帮助:array[x][3]
。
真的难倒这个,非常感谢任何帮助。
答案 0 :(得分:2)
您的基本问题是您以字节为单位计算文件大小,然后尝试从文件中读取多个整数。由于整数是(在大多数机器上)4个字节,这将失败,并且您只会读入nums
数组的第一个四分之一。其余的将包含(并打印成)随机垃圾,这就是你所看到的。
您应该检查fread
的返回值,以确保它有意义。如果您将代码更改为
int numread = fread(nums,sizeof(int),sz * 3, fp);
printf("Read %d integers from file\n", numread);
for (int k = 0; k < sz; k++) {
if (k < numread/3) {
printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]);
} else {
printf("Entry number %d doesn't exist in the file\n", k);
}
}
你会立即看到问题。
始终检查您的返回值。