按文件大小动态分配的数组太大

时间:2017-02-02 20:59:31

标签: c arrays sorting dynamic file-io

我正在进行类分配,需要一些动态分配数组的帮助。我正在使用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。以下是输入文件:

inputFile1:

1
3
7
9

inputFile2:

2
4
8

inputFile3:

5
6
10
0

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

FILE_SIZE:

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

2 个答案:

答案 0 :(得分: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]);
}

答案 1 :(得分:0)

尺寸计算包括回车&#34; \ n&#34;文件末尾的字符。因此,您为第一个文件分配8个整数的空间,为第二个文件分配6个整数,为第三个文件分配10个整数(10,因为数字&#34; 10&#34;有两个数字)。

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

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