こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

投稿日時 - 2007-08-12 23:15:01

QNo.3250282

すぐに回答ほしいです

質問者が選んだベストアンサー

★アドバイス
>コマンドラインでテキスト形式のファイルを読み込み、
>特定の部分を表示させたあとに、
>コマンドラインで指定したファイルに行を逆順にして書き込む・・・といった内容です。
 ↑
 これと同じ処理をサンプルとして載せておきます。
 質問のソースと比べてみてデバッグをして下さい。
 私のサンプルでは普通に実行できます。
 でもあまり詳しいエラーチェックは付けていません。

サンプル:
#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 とステップアップして作れば良い。
 いきなりデバッグなしに問題なく出来るような人間は少ないと思う。
 やっぱ少しずつ動作確認してから作り上げていけば良い。
 最初はね。
・以上。デバッグを頑張って下さい。

投稿日時 - 2007-08-13 00:05:01

お礼

無事にデバッグできました。
ソースまで書いてくださってありがとうございます。

投稿日時 - 2007-08-13 23:34:37

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

読み込み対象のテキストファイル test.txt が 11行以上あると、
while(fgets(line[i],LINE,fp_in)!=NULL){
で確実にエラーになります。(Linux, cygwin なら Segmentation Fault) これを解決するには、変数 line, rv を十分な容量を確保できるようにしなければなりません。

投稿日時 - 2007-08-13 01:35:49

お礼

今回読みとるファイルは4行なのですが・・・、そういった原因でエラーも出るのですか。
ありがとうございます。今後の役に立てます。

投稿日時 - 2007-08-13 23:41:20

ANo.2

Wr5

どういったエラーが出るのでしょうか?

とりあえず…パっと見た限りでは、
> while(fgets(line[i],LINE,fp_in)!=NULL){
で吹っ飛ぶ可能性がありそうですが。
この行でワーニング出ていませんか?
C4700の。

投稿日時 - 2007-08-13 00:12:00

お礼

英語を読み取ったら"i"が許可なしに使われている・・・的な内容が書いてありました。
コンパイル自体は普通にできました。
問題は解決しましたが、指摘があった部分をもう少し調べてみます。

投稿日時 - 2007-08-13 23:39:04

あなたにオススメの質問