• 締切済み

テキストの内容を変数に代入

テキストの内容を変数に入れたいのですが、 改行している部分で読み込みが終わってしまうのですが どのようにすればいいのでしょうか? 下のプログラムでは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を使ってもみたのですがよくわかりませんでした。 教えて頂けたら幸いです。

  • nipa-
  • お礼率22% (2/9)

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >テキストの内容を変数に入れたいのですが、 >改行している部分で読み込みが終わってしまうのですが >どのようにすればいいのでしょうか?  ↑  これはファイルのすべてを変数(バッファ領域)に入れたいの? >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)
回答No.3

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)
回答No.2

fscanfだと改行や空白(半角)、タブでも切れちゃいます fgetsだと改行で切れます freadで500バイト読み込めばいいのでは

  • asuncion
  • ベストアンサー率33% (2126/6287)
回答No.1

while文をどんな風に使ってうまくいかなかったかを 提示してくだされば、「こんな風に手を入れればよいです」という 回答ができるかもしれません。

関連するQ&A

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • 文章から改行を削除して表示する

    #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char row[124]; int c; if( (fp=fopen(argv[1],"r")) == NULL){ fprintf(stderr,"eror\n"); exit(1); }else{ while(fgets( row , sizeof(row) , fp)!=NULL){ printf("%s",row); } fclose (fp); } } というコードでtex.txtという文章ファイルから改行を削除した結果を表示したかったのですが、結果としてオリジナルとまったく同じ文が出てきます。fgetsで改行はふくまれないようにしたつもりなのですが、何故でしょう?解説お願いします。 text.txt: abcdefg hijklmn opqrstuvwxyz

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • ファイルに文字列を書く

    ファイルを2つ読み込んでファイルを書き直そうとしたのですが 2度目に書き込もうとしたときに改行の書き込みがおかしくなってしまいます してほしいところで改行を一回だけしてほしいと思っているのですが 実際には多数改行されます どうしたら改行が一回だけになりますか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ if(i<999){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf); i++; } else{ tm[999] = (char*)malloc(strlen(buf+1)); strcpy(tm[999], buf); } } fclose(fp); if(i<1000){ sei=i; } else{ sei=1000; } fp =fopen("chat_deta.txt","w+"); for(i=0;i<sei;i++){ fprintf(fp,"%s\n",tm[i]); } if(i!=(sei-1)){ fprintf(fp,"\n"); } for(i=0;i<sei;i++){ free(tm[i]); } fclose(fp); } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • fgetsでエラー

     C言語を勉強しているものです。 fgetsやfscanfで第一引数にダブルポインタ変数を用いるとエラーが出ます。 なぜそうなるんでしょうか? ダブルポインタだと不可能なんでしょうか? char **moji; FILE *fp; moji = (char**)malloc(sizeof(char*) * 128 * 256); fp = fopen("test.txt","r+"); fgets(moji[0], 26, fp); //ここでエラー mojiを[0]で指定してあげてもエラーなんでしょうか? fgetsだけでなくfscanfでもそうです。 どうしてそうなんるんでしょう?

  • ファイルを読み込んで条件式を満たさない

    ファイルを読み込んで一部の文字列が来たら別のファイルの文字列を書き込んでもらうプログラムを作ろうとしたのですが、何故かifを使って条件分岐を試みたところ分岐してくれません。 どのようにしたら分岐しますか? 出来ればソースもお願いします。 ---ソースの内容--- #include <stdio.h> #include <string.h> void main(void){ FILE *fp,*fp2; char buf[100],buf2[100]; fp=fopen("yasa.txt","r+"); while( fgets( buf, 100, fp ) != NULL ){ if(strcmp(buf,"じゃがいも")==0){ fp2=fopen("kuda.txt","r+"); while( fgets( buf2, 100, fp2 ) != NULL ){ printf("%s",buf2); } fclose(fp2); } else{ printf("%s",buf); } } fclose(fp); } ---ソースここまで--- ---yasa.txtの内容--- きゃべつ にんじん じゃがいも だいこん セロリ ---yasa.txtここまで--- ---kuda.txtの内容--- もも オレンジ みかん ぶどう ---kuda.txtここまで---

  • ファイル入出力について教えて下さい。2

    ご覧いただきありがとうございます。 何度も低レベルな質問で申し訳ありません。 A.PRMというファイルに、 I have a pen. He has a pen. と2行の文章が入っています。 これを読み取り、printfで画面表示させたいのですが、 #include <stdio.h> int main(void) { FILE *fp; char a[50]; char b[50]; if( (fp=fopen("A.PRM", "r" )) != EOF ) { fgets( a, 49, fp ); fgets( b, 49, fp ); } fclose( fp ); printf( "a = %s\n", a ); printf( "b = %s\n", b ); return 0; } とすると、fgetsで余分な改行が入ってしまいます。 fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。 どうしたらよいでしょうか? 是非ご回答いただきたいです。よろしくお願いいたします。

  • どうやってフローチャートを書きますか

    #include<stdio.h>   void main()   {   FILE*fp;   char buf[128];   char *rc;   char fname[20];   do{   printf("file name>>>");   scanf("%s",fname);   fp=fopen(fname,"r");   if=(fp==NULL) printf("File Open Err¥n");   }while(fp==NULL);   rc=fgets(buf,128,fp);   while(rc!=NULL){    printf("%s",buf);    rc=fgets(buf,123,fp);    }    fclose(fp);    }

  • fscanfで格納された変数がおかしいです。

    fscanfで格納された変数がおかしいです。 ダブルポインタで定義した変数にfscanfでファイルから文字列データを読み込んでいるのですが 表示がおかしな事になっています。 読み込んだファイルの内容は、 aiueo kakikueko sasisuseso tatituteto です。 表示された結果が kakikueko sasisuseso tatituteto kakisasitatituteto sasitatituteto tatituteto 自分では解決しずらいのでここで質問をさせて頂くことになりました。 C/C++で記述してあるのですが、以下にソースを載せておきますのでご指摘ください。 /* double pointa */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 256 char** size; // TEST void test(void) { for(int l = 0; l < 3; l++) { printf("\n%s", &size[l]); } } int main() { FILE* fp; int c = -1; char moji[MAXSIZE]; if((fp = fopen("test.txt","rb")) == NULL) { printf("error"); exit(1); } while(fscanf(fp,"%s",moji) != EOF) c++; size = (char**)malloc(sizeof(char) * MAXSIZE * c); // 初めに戻す fseek(fp, 0, SEEK_SET); // 最初の文だけ取り出す fscanf(fp,"%s",moji); // 一文を格納する for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) { printf("\n%s", &size[l]); } printf("\n"); test(); fclose(fp); getchar(); free(size); return 0; } test関数内で表示するとおかしな結果がでるのですが何故かわかりません。 よろしくお願いします。

  • 続jファイルに文字列を書く

    あれから後一歩と言うところにきました たぶんmallocのバグだと思いますがチャットのシステムを作ろうとしているのですが 読み込み時にエラーになります ソースの注目部分を見てほしいのですが、 注目部分はbuf+1 にすると 文字列が1文字ずつ消えていくバグになり bufにすると 3行目を書き込んだ時点で3行目がの頭の部分の文字列がおかしくなり4行目を書き込もうとするとエラーになります ちゃんと動作するにはどのように書けば良いですか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf+1); //ここを注目 if(i<999){ i++; } } fclose(fp); if(i<=1000){ sei=i; } else{ sei=1000; } fp =fopen("moto.txt","w"); for(i=0;i<sei;i++){ if(i==0){ fprintf(fp,"%s\n",tm[0]); } else{ fprintf(fp,"%s",tm[i]); } } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

専門家に質問してみよう