アプリ版:「スタンプのみでお礼する」機能のリリースについて

int i,j,tmp;
long a[64];
char b[64];
i = 0;
FILE *fp;
fp = fopen("test.txt", "r");
while (fscanf(fp, "%d %s", &a[i], b)!=EOF){
i++;
}
for (i = 1; i < 64; i++){
j = i;
while ((j > 0) && (a[j - 1]>a[j])){
tmp = a[j - 1];
a[j - 1] = a[j];
a[j] = tmp;
j--;
}
}
fprintf(fp, "\n%d %s", a[i], b);

test.txtから値を読み込んで昇順にしたいのですが並び替わりません
txtの中身はこのような感じで
2000 田中
1900 佐藤
3000 山田
どのようにすればいいでしょうか
読み込みは出来ていると思うのですが

質問者からの補足コメント

  • 期待動作は
    1900 佐藤
    2000 田中
    3000 山田
    になってtxtに上書きすることです

    63までではなくaの数だけチェックしたいのですが、上の例なら3
    1950 田中
    1900 佐藤
    2000 橋本
    1960 山田
    なら4のような感じで

    あと2次元配列にしなきゃいけないみたいです

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/01/20 09:59
  • 無事完成しました
    ありがとうございました

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/01/21 01:23

A 回答 (2件)

>期待動作は


>1900 佐藤
>2000 田中
>3000 山田
>になってtxtに上書きすることです

現状からだと道は通そうですねぇ…(つまりいろいろ足りない)
結果だけの問題(C言語のプログラムでやらなければならない。という縛りがない)なら、sortコマンドとかで終わりそうですが。

>あと2次元配列にしなきゃいけないみたいです

二次元配列ではなく、構造体の配列とするべきでしょう。
テキストファイル内の1行を構造体1つに納められるように。
まぁ、char b[64][名前の最大文字が格納できる長さ]の二次元配列でもソート時の入れ替え処理でまるっと入れ替える必要はあるでしょうけど。
ちなみに、読み込みが64個(用意した配列サイズ以上)になった場合は読み込みを中断させないと、OSに殺されます。たぶん。

>63までではなくaの数だけチェックしたいのですが

配列aは全部で64個あります。
「読み込めた数」ということならば、読み込み処理が終了した時に「いくつ読み込めたのか」を記録しておく必要があります。
# fscanf()しているループが終了した時のiに値が入っていますが、その後で破壊されます。ので、どこかに保存する必要があります。

上書き…だといろいろと面倒ですので、読み込みが終了したらfclose()で一度閉じる。
構造体のソート処理が完了した時に新規作成でファイルをオープンして書き出す。
ということになるでしょう。
# 一時ファイルに書き出して、完了後に元ファイルを削除し一時ファイルを元ファイルの名前に変更する。という方法もある。
# こちらの方が正常に完了するまで元ファイルの内容が失われないのでおすすめではあるが…いろいろと手間が掛かることは確かですな。
# というわけで、別ファイルに出力するようにして完成まで続けるか、printf()でそのまま標準出力に出しておく…というのが妥当でしょう。
この回答への補足あり
    • good
    • 0

いろいろ足りていないと思いますけどね……。



>並び替わりません

期待動作がどういうもので、結果はどうなっていますか?

>while (fscanf(fp, "%d %s", &a[i], b)!=EOF){

char b[]f使い回ししているので、最後に読み込んだものしか表示できませんが、それでOKなんでしょうか?

>for (i = 1; i < 64; i++){

3つしか読み込めなくてもa[63]までチェックするのは意図通りでしょうか?
ちなみに読み込みできていない箇所の値は0になります。…とは限らないのですがその辺りはOKです?
# long a[64];がローカル変数かグローバル変数かによる。グローバル変数なら0で初期化されていたかと。

>fprintf(fp, "\n%d %s", a[i], b);

forループの外側にあるのでa[64]を参照しますがその場所は「安全」ですか?
forループが終了するのは「i++の結果、64未満ではなくなった時」=64になった時です。
# long a[64]で保証されるのはa[0]~a[63]ですけど。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!