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 山田
どのようにすればいいでしょうか
読み込みは出来ていると思うのですが
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>期待動作は
>1900 佐藤
>2000 田中
>3000 山田
>になってtxtに上書きすることです
現状からだと道は通そうですねぇ…(つまりいろいろ足りない)
結果だけの問題(C言語のプログラムでやらなければならない。という縛りがない)なら、sortコマンドとかで終わりそうですが。
>あと2次元配列にしなきゃいけないみたいです
二次元配列ではなく、構造体の配列とするべきでしょう。
テキストファイル内の1行を構造体1つに納められるように。
まぁ、char b[64][名前の最大文字が格納できる長さ]の二次元配列でもソート時の入れ替え処理でまるっと入れ替える必要はあるでしょうけど。
ちなみに、読み込みが64個(用意した配列サイズ以上)になった場合は読み込みを中断させないと、OSに殺されます。たぶん。
>63までではなくaの数だけチェックしたいのですが
配列aは全部で64個あります。
「読み込めた数」ということならば、読み込み処理が終了した時に「いくつ読み込めたのか」を記録しておく必要があります。
# fscanf()しているループが終了した時のiに値が入っていますが、その後で破壊されます。ので、どこかに保存する必要があります。
上書き…だといろいろと面倒ですので、読み込みが終了したらfclose()で一度閉じる。
構造体のソート処理が完了した時に新規作成でファイルをオープンして書き出す。
ということになるでしょう。
# 一時ファイルに書き出して、完了後に元ファイルを削除し一時ファイルを元ファイルの名前に変更する。という方法もある。
# こちらの方が正常に完了するまで元ファイルの内容が失われないのでおすすめではあるが…いろいろと手間が掛かることは確かですな。
# というわけで、別ファイルに出力するようにして完成まで続けるか、printf()でそのまま標準出力に出しておく…というのが妥当でしょう。
No.1
- 回答日時:
いろいろ足りていないと思いますけどね……。
>並び替わりません
期待動作がどういうもので、結果はどうなっていますか?
>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]ですけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cで2次元配列にCSVファイルを...
-
C言語でのファイル読み込み
-
DXFファイルをVBで取り込み、図...
-
ファイル入力のデータを構造体...
-
バイト型のデータを16進表記で...
-
CFileの使い方を教えてください
-
VBAでテキストファイルを複数開...
-
ファイルからビット単位での読...
-
ファイル操作
-
ファイルのアクセス回数について
-
エクセルのプロパティーでセキ...
-
バッチファイル 二つ上のディ...
-
エクセルで複数のコメントのサ...
-
VBA一覧取得 再投稿
-
エクセルvbaでdocuworksprinter...
-
Windows10でコマンドプロンプト...
-
【VBA】テキストファイルを指定...
-
カンマ区切りのCSVファイルから...
-
ファイルサーバ上のファイルが...
-
ExcelブックをGoogleスプレッド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
VBAでテキストファイルを複数開...
-
RGBのバイナリデータをCImageに...
-
VBAでテキストファイルの改行を...
-
DXFファイルをVBで取り込み、図...
-
[VBS] 16進数でバイナリファイ...
-
ファイルをメモリに出力する方法
-
ファイル内の(&H0A)を(&H0D0A)...
-
テキストファイルを後ろから読...
-
Cで2次元配列にCSVファイルを...
-
ファイル入力のデータを構造体...
-
Excel VBAで画像解析
-
VBScriptの配列は、要素数を指...
-
fread関数の使い方がわかりませ...
-
ファイルからビット単位での読...
-
awk getlineをもう一度ファイル...
-
バイナリファイルでOutOfMemory...
-
VBSにてCSV読み込みし比較
-
バイナリファイルの一部分をカ...
-
日本語混じりのファイルをラン...
おすすめ情報
期待動作は
1900 佐藤
2000 田中
3000 山田
になってtxtに上書きすることです
63までではなくaの数だけチェックしたいのですが、上の例なら3
1950 田中
1900 佐藤
2000 橋本
1960 山田
なら4のような感じで
あと2次元配列にしなきゃいけないみたいです
無事完成しました
ありがとうございました