とても見辛く、メソッドも利用しないクソコードで申し訳ありません。
これは、"人の名前(空白)点数"というものが20人分記録されているファイルを点数順にソートして新しいファイルに記述するプログラムです。
これをコンパイルしたところうまくいくのですが、ファイルには何も書き込まれません。
指定したファイル名は何度も確認したのでそこのミスではないと思います。また、途中で選択ソートを行なっていますが、ここの実行はうまくいっています。
また、いろいろ試行錯誤したところ一番最後の二重for文、つまりfputcをするところをとても単純に
C
1 while ((ch = fgetc(sfp)) != EOF) { 2 fputc(ch, dfp); /* コピー先ファイルにコピー元ファイルの内容を書き込む*/ 3 }
に書き換えたところうまくいきましたので、おそらくエラーを吐いているのは最後のfor文のところだと思うのですが皆目見当つきません。
どうか回答の程よろしくお願い致します。
C
1#include <stdio.h> 2#define N 20 3 4int main(int argc, char *argv[]) 5{ 6 7 8 9 int line[N][N]; 10 int score[N][2]; 11 int newScore[N]; 12 int ch; 13 int k = 0,m = 0, tmp = 0, min = 0; 14 int s = 0, i = 0, j = 0, t = 0; 15 FILE *sfp, *dfp; 16 17 // コマンドライン引数が2つ指定されているかどうか確認する 18 if (argc != 3) { 19 printf("missing file argument\n"); 20 return 1; 21 } 22 23 if ((sfp = fopen(argv[1], "r")) == NULL) { //コピー元ファイルのオープン 24 printf("can't open %s\n", argv[1]); 25 return 1; 26 } 27 28 if ((dfp = fopen(argv[2], "w")) == NULL) { // コピー先ファイルのオープン 29 printf("can't open %s\n", argv[2]); 30 fclose(sfp); //コピー元ファイルのクローズ 31 return 1; 32 } 33 34 while ((ch = fgetc(sfp)) != EOF) { //数字を見つけたらscoreに記録 35 if(ch <= '9' && ch >= '0'){ 36 score[s][t] = ch; 37 t++; 38 } 39 else if(ch == '\n'){ //改行を見つけたらscoreを改行 40 s++; 41 t = 0; 42 } 43 else if(ch >= 'a' && ch <= 'Z'){ //文字を見つけたらlineに記録 44 line[i][j] = ch; 45 j++; 46 } 47 else if(ch ==' '){ //空白を見つけたらlineを改行 48 i++; 49 j = 0; 50 } 51 } 52 53 for(i = 0; i < sizeof(score) / sizeof(score[0]); i++){ 54 newScore[i] = score[i][0] *10 + (score[i][1]); //scoreを10進法にしてnewScoreに記録 55 56 } 57 58 int length = 20; 59 60 for(i = 0; i < length-1; i++){ //選択ソート 61 min = newScore[i]; 62 k = i; 63 for(j = i+1; j< length; j++){ 64 if(min > newScore[j]){ 65 min = newScore[j]; 66 k = j; 67 } 68 } 69 tmp = score[i][0]; //newScoreとscoreをswap 70 score[i][0] = score[k][0]; 71 score[k][0] = tmp; 72 tmp = score[i][1]; 73 score[i][1] = score[k][1]; 74 score[k][1] = tmp; 75 tmp = newScore[i]; 76 newScore[i] = newScore[k]; 77 newScore[k] = tmp; 78 for(m = 0; m < N; m++){ //同時に名前もswap 79 tmp = line[i][m]; 80 line[i][m] = line[k][m]; 81 line[k][m] = tmp; 82 } 83 } 84 85 for(i = 0; i < sizeof(line) / sizeof(line[0]) ;i++) { 86 for(j = 0; j < sizeof(line[0]) / sizeof(line[0][0]) ;j++){ //名前入力 87 fputc(line[i][j], dfp); 88 } 89 fputc('\t', dfp); //スペース 90 fputc(score[i][0], dfp); //スコア入力 91 fputc(score[i][1], dfp); 92 fputc('\n', dfp); //改行 93 } 94 95 fclose(dfp); // コピー先ファイルのクローズ 96 fclose(sfp); // コピー元ファイルのクローズ 97 98 return 0; 99}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/24 12:45
2016/10/24 14:52