2016-08-31 5 views
2

テキストファイルに303桁の80370の長さのリストがあり、それぞれが別々の行にあります。
私はCでそれらを並べ替えたいと思います。C:配列に収まらない長いリストを並べ替える

私の考えは、新しいファイルを作成してから最初の番号を追加することでした。
次に、別の番号と比較するたびに小さければ、もう1つの数字が追加されます。簡単です。しかし、それが大きい場合は、新しい番号を前に付ける必要があります。
私はそうのように先頭に追加してみました:

void prepend(char line[], FILE* w, FILE* waux, char filename[], char auxname[]) { 
    fprintf(waux, "%s\n", line); //print new number to new file (waux) 
    char ch; 
    while((ch = fgetc(w)) != EOF) { 
     fputc(ch, waux); //read old file (w) and add to new file (waux) 
    } 
    remove(filename); //delete old file 
    rename(auxname, filename); //rename new file to old file's name 
} 

しかし、私は、出力を読み取ろうとそれは(メモ帳++で)NULLの文字で埋めています。
何百万ものNULL文字の中で数字を見つけることができますが、それらは並べ替えられません。

+5

は、なぜあなたは、ファイルへの出力の一部を書き込むことによってそれを行うにはしたいですか?すべてのデータを読み、すべてのデータを一度に並べ替えて書き出します。実際にはあなた自身のソート関数をロールする必要もなく、 '' 'qsort'関数を使うことができます:http://en.cppreference.com/w/cpp/algorithm/qsort – Jack

+3

これはちょっと2メガバイト(ポインタを使用する場合は、おそらく3MB)。非常に多くの数を含むことができる配列を(malloc()を使って)割り当てるのは難しくありません。 –

+0

申し訳ありませんが、自分の考えが自分の数字を並べ替えることができないことに気付きました。しかし、あなたがそれらを並べ替える方法のアイデアを持っているなら、それは素晴らしいでしょう。 (: – AAN4EVA

答えて

3

mallocを使用してすべてのデータにメモリを割り当てる必要があるという意見に同意しますが、メモリ内のデータを並べ替えてデータをファイルに書き込むこともできます。

私は働いていない、あなたのアプローチの理由は、あなたが開いているファイルには、

remove(filename); //delete old file 
rename(auxname, filename); //rename new file to old file's name 

を使用している時にファイルを扱う持っていることであると推測している私の提案:

  1. オープン関数内のファイル
  2. 読み取りと追加を行います。
  3. ファイルを閉じます。
  4. 次に、削除して名前を変更します。

void prepend(char line[], char filename[], char auxname[]) { 

    FILE* w = fopen(filename, "r"); 
    if (w == NULL) 
    { 
     fprintf(stderr, "Unable to open %s for reading from.\n", filename); 
     return; 
    } 

    FILE* waux = fopen(auxname, "w"); 
    if (waux == NULL) 
    { 
     fprintf(stderr, "Unable to open %s for writing to.\n", auxname); 
     fclose(w); 
     return; 
    } 

    fprintf(waux, "%s\n", line); //print new number to new file (waux) 
    int ch; 
    while((ch = fgetc(w)) != EOF) { 
     fputc(ch, waux); //read old file (w) and add to new file (waux) 
    } 

    fclose(waux); 
    fclose(w); 

    remove(filename); //delete old file 
    rename(auxname, filename); //rename new file to old file's name 
} 
関連する問題