我正在进行类分配,需要一些动态分配数组的帮助。我正在使用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;
}
答案 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个字节,读入直到用完,然后重新分配到更大的缓冲区。