2017-02-02 2 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 

ご覧のとおり、余分な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

あなたはすでに関数でファイルサイズを取得していますが、ループごとに関数を呼び出す必要はありません。単に '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つの整数、2番目のファイルには6個の整数、3番目のファイルには10個の整数(10桁の数字は2桁であるため10個)のスペースが割り当てられます。

正しい割り当て方法は、ファイル内のバイト数をカウントするのではなく、行数(実際には数値を含むため空白行をスキップすることができます)です。

しかし、それはあまりにも多くのトラブルです。代わりに、ちょうど1000バイトを割り当て、あなたが使い果たされるまで読み込み、次に大きなバッファに再割り当てすることを検討してください。

関連する問題