- 締切済み
テキストの内容を変数に代入
テキストの内容を変数に入れたいのですが、 改行している部分で読み込みが終わってしまうのですが どのようにすればいいのでしょうか? 下のプログラムでは1行しか変数に代入できません。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include<stdio.h> main(){ char a[500]; FILE *fp; fp = fopen("****.txt","r"); fscanf(fp,"%s",&a); fclose(fp); return 0; } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ whileで回すと上手くいくとは思ったのですが、fscanfを回しても 上手くいかずわかりません。 whileとfgetsを使ってもみたのですがよくわかりませんでした。 教えて頂けたら幸いです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >テキストの内容を変数に入れたいのですが、 >改行している部分で読み込みが終わってしまうのですが >どのようにすればいいのでしょうか? ↑ これはファイルのすべてを変数(バッファ領域)に入れたいの? >whileで回すと上手くいくとは思ったのですが、fscanfを回しても >上手くいかずわかりません。 ↑ バッファ領域への追加をしていないだけではないの? >whileとfgetsを使ってもみたのですがよくわかりませんでした。 ↑ 工夫すればこの組み合わせで出来ますよ。 ・ファイルの内容を1つの変数(バッファ領域)に取得したいなら次の方法をどうぞ。 サンプル1: unsigned long size; char *buff; char *tail; FILE *fp; int ch; if ( (fp = fopen("sample.txt","r")) != NULL ){ // サイズを計算 for ( size = 1 ; fgetc(fp) != EOF ; size++ ){ ; } // メモリを確保 if ( (buff = (char*)malloc(size)) != NULL ){ // バッファへ取得 frewind( fp ); for ( tail = buff ; (ch = fgetc(fp)) != EOF ; tail++ ){ *tail = (char)ch; } *tail = '\0'; // ここで buff を利用 printf( "%s", buff ); // 解放 free( buff ); } fclose( fp ); } サンプル2: char buff[ 256 * 1024 ]; // 巨大バッファ領域(256 KB) char *tail = buff; char *stop = buff + sizeof(buff) - 1; FILE *fp; int ch; if ( (fp = fopen("sample.txt","r")) != NULL ){ // 読み込み while ( (ch = fgetc(fp)) != EOF ){ if ( tail >= stop ){ printf( "メモリが足りませんでした。\n" ); fclose( fp ); exit( 255 ); } *tail++ = (char)ch; } *tail = '\0'; // ここで buff を利用 printf( "%s", buff ); fclose( fp ); } 解説: ・サンプル1は最初にファイルサイズを計算してから動的にメモリを確保しています。 その後に動的メモリに全ファイルの内容を fgetc() 関数で単純に入れています。 ・サンプル2は最初に巨大なバッファ領域 256 KB を宣言してから fgetc() 関数で 単純に入れています。だたし、メモリの残り容量をチェックするために stop の ポインタで終わりを比較しています。メモリが足りたいとエラー・メッセージを 表示して強制終了しています。足りないときはバッファ領域を増やすか、サンプル1の 方法を使って下さい。 ・以上。
- maku_x
- ベストアンサー率44% (164/371)
while() 文を使ってループさせるときに、同じ配列 a[] に文字列を入れているのではないでしょうか。 例えばこんな感じに書けば、(ファイルサイズ等上限付ですが)それなりに動作すると思います。 #include <stdio.h> #define BUF_SIZE_MAX 65536 #define PRT_SIZE_MAX 1024 main() { char buf[BUF_SIZE_MAX], *pary[PRT_SIZE_MAX], *s, **pp; FILE *fp; fp = fopen("****.txt", "r"); for (s=buf, pp=pary; (fgets(s, (&buf[BUF_SIZE_MAX] - s), fp) != NULL; ) { *pp++ = s; s += strlen(s) + 1; } fclose(fp); return 0; }
- php504
- ベストアンサー率42% (926/2160)
fscanfだと改行や空白(半角)、タブでも切れちゃいます fgetsだと改行で切れます freadで500バイト読み込めばいいのでは
- asuncion
- ベストアンサー率33% (2127/6289)
while文をどんな風に使ってうまくいかなかったかを 提示してくだされば、「こんな風に手を入れればよいです」という 回答ができるかもしれません。