2017-02-02 3 views
1

Я работаю над назначением класса и нуждаюсь в некоторой помощи с динамически распределенными массивами. Я использую 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 

Как вы можете видеть, что в настоящее время дополняются дополнительной 0s. Вот входные файлы:

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

Несвязанный, но вы уже фиксируете размеры файлов один раз своей функцией, на самом деле не нужно снова вызывать эту функцию для каждого цикла, просто используйте 'size0',' size1' и 'size2' – yano

ответ

1

Ваши входные файлы имеют несколько линий, каждая из которых имеет текстовое представление числа. Однако функция размера файла подсчитывает общее количество байт в файле. Это не одно и то же.

Хотя вы все еще можете использовать размер файла для выделения пространства (вы просто получите больше, чем вам нужно), вам нужно вместо этого проверить возвращаемое значение 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]); 
} 
+0

Это имеет смысл, я имел подозрение, что он читал не только цифры, но и цифры. Спасибо, спасибо. – cnh995

+0

@ cnh995 Рад, что я мог бы помочь. Не стесняйтесь [принять этот ответ] (http://stackoverflow.com/help/accepted-answer), если вы сочтете это полезным. – dbush

+0

Я закончил тем, что делал что-то немного другое, но это было большой помощью в том, чтобы заставить меня туда, очень ценится. – cnh995

0

Расчет размера включает символ возврата «\ n» каретки в конце файла. Поэтому вы выделяете пространство для 8 целых чисел для первого файла, 6 целых чисел для второго файла и 10 целых чисел для третьего файла (10, потому что число «10» имеет две цифры).

Правильной стратегией распределения было бы не считать байты в файлах, а строки (которые фактически содержат числа, что позволяет пропустить пустые строки).

Но это слишком большая проблема. Вместо этого рассмотрите только выделение 1000 байт, зачитайте их до тех пор, пока вы не закончите работу, а затем перераспределите в больший буфер.

Смежные вопросы