【问题标题】:Array dynamically allocated by file size is too large按文件大小动态分配的数组太大
【发布时间】:2017-02-02 20:59:31
【问题描述】:

我正在处理一个类分配,需要一些关于动态分配数组的帮助。我正在使用 file_size 尝试从 3 个文件中提取文件大小以将数组分配给该大小,然后我需要写入数组中的数据并对其进行排序。我现在的问题是数组的大小;现在我的输出(忽略排序)是:

1
3
7
9
0
0
0
0
2
4
8
0
0
0
5
6
10
0
0
0
0
0
0

如您所见,它被额外的 0 填充。以下是输入文件:

输入文件1:

1
3
7
9

输入文件2:

2
4
8

输入文件3:

5
6
10
0

我需要一些帮助来弄清楚这是怎么回事以及问题出在哪里。我想摆脱那些额外的 0,我什至不确定它们来自哪里。排序方面的帮助也将不胜感激。

文件大小:

long file_size(FILE *inputFile)
{
    if(inputFile == NULL)
        return -1;

    long pos = ftell(inputFile);

    fseek(inputFile, 0, SEEK_END);

    long size = ftell(inputFile);

    fseek(inputFile, pos, SEEK_SET);

    return size;    
}

主要:

int main(void)
{
    FILE *file0 = fopen("list0.txt", "r");
    FILE *file1 = fopen("list1.txt", "r");
    FILE *file2 = fopen("list2.txt", "r");
    FILE *output = fopen("hw3.out", "w");

    long size0 = file_size(file0);
    long size1 = file_size(file1);
    long size2 = file_size(file2);

    long totalSize = size0 + size1 + size2;

    int *numbers = malloc(totalSize * sizeof(int));

    int i;
    int index = 0;

    for(i = 0; i < file_size(file0); i++)
    {
        if(!feof(file0))
        {
            fscanf(file0, "%i", &numbers[index]);
            index++;
        }
        else
            break;
    }

    for(i = 0; i < file_size(file1); i++)
    {
        if(!feof(file1))
        {
            fscanf(file1, "%i", &numbers[index]);
            index++;
        }
        else
            break;
    }

    for(i = 0; i < file_size(file2); i++)
    {
        if(!feof(file2))
        {
            fscanf(file2, "%i", &numbers[index]);
            index++;
        }
        else
            break;
    }



    for(i = 0; i < totalSize; i++)
    {
        fprintf(output, "%i\n", numbers[i]);
    }


    fclose(file0);
    fclose(file1);
    fclose(file2);
    fclose(output);
    free(numbers);
    return 0;
}

【问题讨论】:

  • 不相关,但是您已经使用函数捕获了一次文件大小,实际上不需要为每个循环再次调用该函数,只需使用 size0size1size2

标签: c arrays sorting dynamic file-io


【解决方案1】:

您的输入文件有几行,每行都有一个数字的文本表示。但是,您的文件大小功能正在计算文件中 bytes 的总数。这些不一样。

虽然您仍然可以使用文件大小来分配空间(您将获得比您需要的更多的空间),但您需要检查scanf 的返回值以查看是否读取了一个数字。如果没有,你就跳出循环。

int index = 0;
while (fscanf(file0, "%i", &numbers[index]) == 1) {
    index++;
}
while (fscanf(file1, "%i", &numbers[index]) == 1) {
    index++;
}
while (fscanf(file2, "%i", &numbers[index]) == 1) {
    index++;
}

for(i = 0; i < index; i++)
{
    fprintf(output, "%i\n", numbers[i]);
}

【讨论】:

  • 这是有道理的,我怀疑它读取的不是数字而是字符。我会试一试,谢谢。
  • @cnh995 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
  • 我最终做了一些稍微不同的事情,但这对我有很大帮助,非常感谢。
【解决方案2】:

大小计算包括文件末尾的回车“\n”字符。因此,您为第一个文件分配了 8 个整数的空间,为第二个文件分配了 6 个整数,为第三个文件分配了 10 个整数(10,因为数字“10”有两位数)。

正确的分配策略不是计算文件中的字节数,而是计算行数(实际上包含数字,因此可以跳过空行)。

但这太麻烦了。相反,考虑只分配 1000 字节,读入直到用完,然后重新分配到更大的缓冲区中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2021-01-15
    • 2013-09-05
    • 2010-12-08
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多