• ベストアンサー

fgetsがうまくいきません。

半角スペースとOで(O = 生存)ライフゲームを作ろうと思っていますが、 printf文で表示するとうまくいきません。 どうしたらよいでしょうか。回答お願いします。 #include<stdio.h> #include<stdlib.h> #define SIZE 20 int main(void) { int i = 0; char board[ SIZE ][ SIZE+1 ]; FILE *fp; if( ( fp = fopen( "life.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません。---life.dat\n"); exit(EXIT_FAILURE); } for(i = 0; i < SIZE; i++)//初期設定 { fgets( *(board + i) , SIZE+1, fp ); }//初期設定終わり for(i = 0; i < SIZE; i++) { printf("%s", *(board + i) ); } return 0; }

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

推測するに、20×20のデータなんですよね。 fgetsは、改行を捨てないので、 改行の分と'\0'の分とで char board[SIZE][SIZE+2]; としてやればうまくいくと思います。

bf109e
質問者

お礼

回答ありがとうございます。 board[ SIZE ][ SIZE + 2 ] とすることによってうまく表示されました。

bf109e
質問者

補足

それで追加質問をお願いしてよろしいでしょうか。 Enterを押すごとにボードの次の時刻の状態を 表すようにしたいのですがうまくいきません。 アドバイスよろしくお願いします。 char n; for( ;; ) { printf("Press Enter\n") scanf("%c", &n); if(n == '\n') /*次の状態の表示*/ else break; }

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#4補足>Enterを押すことによって… 一文字入力待ちがうまくできないということだったら、 #5さんのようにgetcharを使えばいいと思います。

bf109e
質問者

お礼

回答ありがとうございます。 おかげでうまくいくことができました。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.5

scanf()でなくて n = getchar(); ではどうですか?

bf109e
質問者

お礼

回答ありがとうございます。 おかげでうまくいくことができました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>ボードの次の時刻の状態を 次の時刻の状態は、着目しているセルの回りの状態によるので、 最低限、そのセルが他から必要とされなくなるまで前の状態を保持(更新できない)しないといけませんが、そういう風につくると難しくなるので、 単純に、更新用(次世代)のボードを用意して、そこに、現在の状態から次世代の状態を計算して書き込んでいくといいんじゃないでしょうか。 そういうことではなくて、もっと細かい話なのでしょうか? そういうことではなくて、コンソール上に表示された、ものを座標指定で更新していく方法がわからんということでしょうか? コンソールで表示されているものを部分的に変更するのは、 DOSのプログラムでは、(ANSIで)エスケープシーケンスでやっていましたが、今は、(windowsのコンソールでは)うまくないようです。 UNIX系では、やったことはないですが、コンソール表示用のライブラリが使えると思いました

bf109e
質問者

補足

説明不足ですみません。 次の時刻の状態の決定は問題ないのですが、 それをEnterを押すことによってくりかえし表示させていくやり方がわかりません。 アドバイスお願いします。

回答No.3

う~ん。 とりあえず入力行と、それに対する出力行と 想定している出力結果を書いてもらえると 回答しやすいかと思いますです。

bf109e
質問者

お礼

回答ありがとうございます。

bf109e
質問者

補足

例えば SIZE 5 とすると、ファイルには ________ O OOO ________ のように書かれています。 とりあえず、これをそのまま表示しようと思っていましたが うまくできませんでした。

回答No.1

確認していないので悪しからず。 fgets( *(board + i) , SIZE+1, fp );   ↓ fgets( *(board + i*SIZE) , SIZE+1, fp ); printf("%s", *(board + i) );   ↓ printf("%s", *(board + i*SIZE) ); でないかしら?

bf109e
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • fgets, sscanf, バッファ、ストリーム について

    ファイルからデータを入力するのに、fscanf の代わりに fgets と sscanf を用いようと考えています。 そこで、sscanf に与えるバッファ文字列を、ファイルストリームのように扱う方法は無いものでしょうか。 例えば以下のデータファイルに対して、以下のプログラムをうまく動作させるには、どのようにすればよいでしょうか。 どうぞ、よろしくお願いします。 (データファイル test.dat) n_data 4 1 3 8 4 (プログラム) #include <stdio.h> main() { int i, n_data, *data; char buf[100]; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); for( i=0; i<n_data; i++ ){ fgets(buf, 100, fp); sscanf( buf, "%d", &(data[i]) ); } sscanf( buf, "\n" ); close( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); } ちなみに、2行の fgets(buf, 100, fp); をコメントアウトして、 "sscanf( buf," を "fscanf( fp," に変更するとうまく動作します。

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後

    CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後平均値を求めて構造体のメンバ、"ave"に格納し表示させたいのですが、読み込み格納している最中で、セグメンテーション違反で終了してしまいます。どなたかよろしければ教えて頂けないでしょうか。 プログラム ************************************************** #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME_00 "f_00_01.CSV" struct Data{ double value; double ave; }; int main(int argc, char *argv[]) { FILE* fp,*fo; // ファイルポインタ用 int n, i, file_size; struct Data *dat; if ((fp = fopen(FILE_NAME_00,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; for(i=0;i<file_size;i++){ fscanf(fp,"%lf",&dat[i].value); printf("%lf\n",dat[i].value); i++; } fclose(fp); printf("\n"); free(dat); return 0; } *************************************************** f_00_01.CSV *************************************************** 2.313725 2.312810 2.314031 2.316167 2.315557 2.313725 . . . . . ***********************************************

  • Cでオセロゲームプログラム

    Cでオセロゲームのプログラムを作ろうと思ってますが 下記のプログラムに構造体、2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法等を含みたいのですが どのように書いていったらいいかわかりません。 どなたかわかる方いましたらよろしくお願いします。 #include <stdlib.h> #include <stdio.h> #define BOARD_SIZE 8 #define WALL '*' #define BLACK 'x' #define WHITE 'o' #define NONE ' ' char board[ BOARD_SIZE+2 ][ BOARD_SIZE+2 ] ; void board_initialize() { int i , j ; /* 周囲を壁で囲む */ for( i = 0 ; i < BOARD_SIZE+2 ; i++ ) { board[ 0 ][ i ] = WALL ; board[ BOARD_SIZE+1 ][ i ] = WALL ; board[ i ][ 0 ] = WALL ; board[ i ][ BOARD_SIZE+1 ] = WALL ; } /* 内部を何もない状態にする */ for( i = 1 ; i <= BOARD_SIZE ; i++ ) { for( j = 1 ; j <= BOARD_SIZE ; j++ ) { board[ i ][ j ] = NONE ; } } /* オセロの初期状態の配置 */ board[ BOARD_SIZE/2 ][ BOARD_SIZE/2 ] = WHITE ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2+1 ] = WHITE ; board[ BOARD_SIZE/2 ][ BOARD_SIZE/2+1 ] = BLACK ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2 ] = BLACK ; } void board_print() { int i , j ; printf( " " ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) printf( "%2d" , i ) ; printf( "\n" ) ; for( j = 1 ; j <= BOARD_SIZE ; j++ ) { printf( "%2d:" , j ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) { switch( board[ j ][ i ] ) { case WALL : printf( "■" ) ; break ; case BLACK : printf( "●" ) ; break ; case WHITE : printf( "○" ) ; break ; case NONE : printf( "+" ) ; break ; } } printf( "\n" ) ; } } int main(void) { board_initialize() ; board_print() ; }

  • fgetsについて質問です;;

    すいません質問です fgets(str,255,fp)で読み込んだ一行が、取り出せずdmy配列に入れることができません これは何故でしょうか? fp = fopen("aaa.dat","r"); for(ss;fgets(str,255,fp) != NULL;ss++ ){ dmy[ss] = str[ss]; printf("%s\n",str); } printf("%s\n",dmy[5]); fclose(fp); }

  • C言語でファイル読み書きを早くしたい。

    いつも利用させてもらって助かっています。 あるプログラムを作成しているのですが、ファイル入力の部分がネックとなってしまって、全体が使いものにならない状況に陥っています。 たくさんのデータをfread1回で読み込むことにより、読み込み速度はずいぶんと改善されましたが、まだ圧倒的に遅い状況です。システムコールを使いましたが、ほとんど改善されませんでした。 読み込み/書き込みの速度を改善する方法として,SSDメモリを使ったりする方法があると思いますが,プログラムの観点から改善できるところはないでしょうか? 下に、ファイル読み込みの部分だけ記述したコードを添付させて頂いたので、改善できる点があれば、御指摘頂けると助かります。 なお、前提として, (1)データはスタック領域だと不足するので、ヒープ領域に確保 (2)データファイルは改行無しの一連のデータ とします。 ちなみに、環境は OS   : CentOS5.3 memory   : 6GB コンパイラ : gcc です。 よろしくお願いします。 //----------------------------------------------------- //通常バージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; FILE *fp; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } fp = fopen("filein.dat", "rb"); fread( data, sizeof( unsigned char), (int)SIZE, fp ); fclose(fp); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; } //----------------------------------------------------- //readシステムコールを使ったバージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } int fd; fd = open( "filein.dat" ); read( fd, data, sizeof(unsigned char)*SIZE); close(fd); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ FILE *fp; fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; }

  • datファイルの読み込み

    初歩的な質問ですみません。 今、819200行のファイルをfscanfで読み込んで配列に格納しているのですが、実行してみるとBus errorが出力されてしまい、うまく格納できません。どなたか至急教えてもらえませんか? ***************************ソース************************************************************ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define pi 3.1415926535 //円周率 #define FILE_SIZE 819200 #define FILE_NAME "test.dat" struct Data{ int time; double voltage; double velocity; double pressure; double trigger; }; int main() { int k,n,N,i=0,j; struct Data dat[FILE_SIZE]; FILE *fp1; FILE *fp2; if ((fp1 = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } //データの読み込み while((fscanf(fp1, "%d %lf %lf %lf %lf",dat[i].time,dat[i].voltage,dat[i].velocity,dat[i].pressure,dat[i].trigger)) !=EOF ){ i++; } fclose(fp1); return 0; } ***************************************************************************************** ********************test.datファイル********************************************** -2.64316 2.329595 0.697657 0.001373 -4.861982 -2.64314 2.325628 0.671961 0.001984 -4.744793 -2.64312 2.320745 0.640333 0.001678 -4.659953 -2.64310 2.319829 0.634400 0.002289 -4.707866 -2.64308 2.319219 0.630449 0.002289 -4.699321 -2.64306 2.317082 0.616607 0.002594 -4.532387 . . . . . *********************************************************************************** 環境はmac osです。 よろしくおねがい致します。

  • fgetsの扱い方について

    今回、c++(言語はc言語)?で下のようなプログラムを書きました。 内容は、与えられたワイド文字列をマルチバイト文字列に変換した後、重要単語.txtに載っている単語が変換された文字列にあるか、を調べるものです。 ただ、実行できていないためプログラム自体があっているかわかりません。 これをvc++2010でエラーなくビルドしたあと、実行すると「ハンドルされていない例外が発生しました」とエラーが出ます。 使い方もよくわかってないブレークポイントを使って調べてみたところ、while(fgets(word,50,fp)!=NULL){ ここまで来るとエラーが発生してるみたいです。 なにが間違ってるんでしょうか? 解決策よろしくお願いします #include <stdio.h> #include <string.h> #include <locale.h> #include <stdlib.h> int main(){ setlocale( LC_ALL, "Japanese"); FILE *fp; fp=fopen("重要単語.txt", "w"); fclose(fp); if( (fp=fopen("重要単語.txt", "r")) ==NULL){ printf("File Not Open!!\n"); } wchar_t *input = L"音声認識を認識した後に変換を行う"; char str[200]; char word[50]; char iword[100]="●"; int pt=0,pp=0,cnt=0,i=0; //str=input;wchar_t→char変換する size_t wlen=0; wcstombs_s(&wlen,str,500,input,_TRUNCATE); while(fgets(word,50,fp)!=NULL){ strcat(word,'\0'); while(str[pt]!='\0'){ if(word[pp]=='\0'){ pp=0; strcat(iword,word); strcat(iword,"\n"); } else if(str[pt]==word[pp]){ pt++; pp++; } else{ pt=pt-pp+1; pp=0; } } pt=0; } fclose(fp); printf("変換後→%s\n",str); printf("重要単語\n%s",iword); return 0; } 重要単語.txtの中身 認識 音声 変換

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • 九九表について

    C言語で九九表を書いているのですが #include <stdio.h> #include <stdlib.h> int main(){ int i, j; int resultOf9x9[] = ???; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++){ printf("%d ", resultOf9x9[i*j]); } printf("¥n"); } exit(0); } 初期値の設定の???の部分をどう宣言していいかわかりません。 よろしくお願いします。

専門家に質問してみよう