2

首先,我是 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]);
}

当我将 nums 的声明移到 sprintf() 上方时,只要我将 nums 的声明移到 sprintf() 下方,它就可以正常工作(即使它就在它上方),输出如下所示:

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].

真的很难过这一点,非常感谢任何帮助。

4

1 回答 1

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);
    }
}

你会立即看到问题。

始终检查您的返回值。

于 2013-04-03T23:33:53.930 回答