- ベストアンサー
Visual C++ 2005のデバッグエラーについて(コマンドライン
コマンドラインを利用してファイルを読み込む類のプログラムを作っているのですが、コンパイルしてデバッグなしで開始をすると、エラーが出てしまいます。 調べようとしても原因がわからず困っています。 回答よろしくお願いします。 サンプルプログラム↓ コマンドラインでテキスト形式のファイルを読み込み、特定の部分を表示させたあとに、コマンドラインで指定したファイルに行を逆順にして書き込む・・・といった内容です。 こちらも途中までLinuxで作成、途中からVisual2005で編集・・・といった感じのプログラムです。 #include<stdio.h> #include<stdlib.h> #define LINE 1000 int main(void) { FILE *fp_in,*fp_out; char line[10][LINE]; char rv[10][LINE]; int i,j,k; fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } while(fgets(line[i],LINE,fp_in)!=NULL){ printf("%d\n",i); i++; } i=1; j=0; while(i<3){ if(i==1){ for(j=0; j<=6; j++){ printf("%c",line[i][j]); } } if(i==2){ for(j=11; j<=15; j++){ printf("%c",line[i][j]); } } i++;} fclose(fp_in); fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } fp_out=fopen("repurica.txt","w"); if(fp_out==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } i=0; k=0; while(line[i]!='\0'){ i++; } while(i<4 ){ rv[k++][LINE]=line[--i][LINE]; } rv[j][LINE]='\0'; printf("%s\n",rv); fclose(fp_in); fclose(fp_out); return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス >コマンドラインでテキスト形式のファイルを読み込み、 >特定の部分を表示させたあとに、 >コマンドラインで指定したファイルに行を逆順にして書き込む・・・といった内容です。 ↑ これと同じ処理をサンプルとして載せておきます。 質問のソースと比べてみてデバッグをして下さい。 私のサンプルでは普通に実行できます。 でもあまり詳しいエラーチェックは付けていません。 サンプル: #include<stdio.h> #include<stdlib.h> // 定数 #define MAX_BUFF 1000 // 1行の桁数 #define MAX_LINE 10 // 最大行数 // メイン関数 int main( int argc, char *argv[] ) { char line[ MAX_LINE ][ MAX_BUFF ]; FILE *fp; int i; // 引数チェック if ( argc != 3 ){ printf( "USAGE: sample.exe <inFile> <outFile>\n" ); return 1; } // オープン処理 if ( (fp = fopen(argv[1],"r")) == NULL ){ printf( "File not found.\n" ); return 2; } // 読み込み for ( i = 0 ; i < MAX_LINE ; i++ ){ if ( fgets(line[i],MAX_BUFF,fp) == NULL ){ break; } printf( "read line...%d\n", (i + 1) ); } fclose( fp ); // ここでクローズ処理 // 特定部分の表示 : (省略) : // 書き出し if ( (fp = fopen(argv[2],"w")) == NULL ){ printf( "Can not open file.\n" ); return 3; } // 逆順で出力 for ( i-- ; i >= 0 ; i-- ){ fprintf( fp, "%s", line[i] ); } fclose( fp ); return 0; } 最後に: ・変数は初期化してから使いましょう。⇒i カウンタなど まずは順番にコンパイルエラーや実行時エラーが起きないようにプログラミング。 (1)ファイルを読み込むだけのプログラミングを正常に。 (2)(1)に加えて特定部分の表示だけのプログラミングを正常に。 (3)(2)に加えて逆順に出力するプログラミングを正常に。 この順番で sample1.c、sample2.c、sample3.c とステップアップして作れば良い。 いきなりデバッグなしに問題なく出来るような人間は少ないと思う。 やっぱ少しずつ動作確認してから作り上げていけば良い。 最初はね。 ・以上。デバッグを頑張って下さい。
その他の回答 (2)
- maku_x
- ベストアンサー率44% (164/371)
読み込み対象のテキストファイル test.txt が 11行以上あると、 while(fgets(line[i],LINE,fp_in)!=NULL){ で確実にエラーになります。(Linux, cygwin なら Segmentation Fault) これを解決するには、変数 line, rv を十分な容量を確保できるようにしなければなりません。
お礼
今回読みとるファイルは4行なのですが・・・、そういった原因でエラーも出るのですか。 ありがとうございます。今後の役に立てます。
- Wr5
- ベストアンサー率53% (2173/4061)
どういったエラーが出るのでしょうか? とりあえず…パっと見た限りでは、 > while(fgets(line[i],LINE,fp_in)!=NULL){ で吹っ飛ぶ可能性がありそうですが。 この行でワーニング出ていませんか? C4700の。
お礼
英語を読み取ったら"i"が許可なしに使われている・・・的な内容が書いてありました。 コンパイル自体は普通にできました。 問題は解決しましたが、指摘があった部分をもう少し調べてみます。
お礼
無事にデバッグできました。 ソースまで書いてくださってありがとうございます。