• ベストアンサー

fread

freadで、a.txtの内容を画面出力するものです。 コピーした結果、 実際のテキストにある、 !  が書き込まれませんでした。 どこが、間違っているか教えてください。 FILE *fp; char str[20];   fp=fopen("a.txt","rb");   while(!feof(fp)){      fread(&str,(sizeof(str)-1),1,fp);      if(feof(fp))            break;      printf("%s",str); }      return 0; }

noname#168725
noname#168725

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

  • ベストアンサー
回答No.5

単純なテキストの処理ならfgets()を使うのが定石ですがそれはさておき。 #4さんの回答で方針はいいのですが、fread()は第二引き数で与えられた要素が何個読めたかを戻します。 従って、この場合は第二引き数と第三引き数を入れ替えるべきです。 また、この戻り値を使えばファイルの終端の検出が(事実上)できますのでループ全体は以下のようにすればいいでしょう。 尚、fclose()もお忘れなく。 -- for (;;) {  int nLen = fread(str, 1, sizeof(str) - 1, fp);  str[nLen] = '\0';  printf("%s", str); // 或いはfputs(str, stdout);  if (nLen < sizeof(str) - 1) {   break;  } }

noname#168725
質問者

お礼

回答ありがとうございます。 解説どうもありがとうございます。 おかげさまで、何とか解決できました。 どうもありがとうございました。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

freadの戻り値を使って strに nullを書き込むかどうかを決定しましょう int nLen = 0;  nLen = fread( str, sizeof(str)-1, 1, fp );  str[nLen] = 0;  printf( "%s", str );  if ( feof( fp ) ) {   printf( "\n" );   break;  } といった具合にしてみてください ...

noname#168725
質問者

お礼

回答ありがとうございます。 なんとなく、掴めました。 回答どうもありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

ルール違反かも知れませんが、一応指摘しておきます。 > fread(&str はNGだと思うよ。 > fread(str のハズ。 そんなことはありません。 &strとすれば、その型はchar (*)[20]ですので、配列全体を指すポインタになります。単なるstrの場合は、配列の1要素を指すポインタですね。

noname#168725
質問者

お礼

回答ありがとうございます。 strでも、&strでもいいようですね。 ありがとうございました。

  • crew21
  • ベストアンサー率26% (58/222)
回答No.2

ごめん、パッと見だけど、 fread(&str はNGだと思うよ。 fread(str のハズ。

noname#168725
質問者

お礼

素早い回答ありがとうございます。 strでやってみましたが、変化しませんでした。 レスありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

     if(feof(fp))            break;      printf("%s",str); の順番だと最後に読み込んだstrが出力される前に終わってしまいますよ。 順番を変えるか      printf("%s",str);      if(feof(fp))            break; またはbreakは不要なので      printf("%s",str); だけでもよさそうですが。

noname#168725
質問者

お礼

素早い回答ありがとうございます。 順番を変えるか またはbreakは不要なので      printf("%s",str); だけでもよさそうですが。 やってみましたが、今度は余計な文字が文末に書き込まれました。 It seems to me that most of the "new" programming languages. を読み込むと、 It seems to me that most of the "new" programming languages. ming languages となり余計な文字列が書きこまれるようです。

関連するQ&A

  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

  • fread関数でわかりません。

    fread関数で次のようにソースを記述しました。 FILE *fp; char c[10]; int i; fp = fopen ("./aaa.txt", "rb"); fread(c, sizeof(char)-1, 10, fp); for(i = 0; i < 10; i++) printf("%02x ", *(c+i)); fclose(fp); return 0; aaa.txtの中には 0x1~0xAの10個の数字が記入されています。 cをint 型にすると正常に読み込めるのですが、char型だと 01 00 00 00 02 00 00 00 03 00 となってしまい、正常に読み込めません。 どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。 Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか? Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか? //getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。

  • freadでダンプ なぜ?

    ファイルを1バイトづつfreadで読み込んで ダンプしているのですが、なぜか16進数で"1A" (10進数で"26")の文字から先をダンプできません。 原因が良くわかりません。 どなたか、わかる方お助けください。  char buf[20];  unsigned short a;  flag = 1;  while (flag == 1){   fread(buf, sizeof(char), 1, fp_in);   a = buf[0];   printf("%02x ",a);   cnt++;   if(cnt == 16){    printf("\n");    cnt = 0;   }     :     : }

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

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

  • fread処理がうまくいかない!!

    バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }

  • ファイルサイズを変更したい

    visualstudio2010を使用しています。 c言語で書いているのですが、 test.txt ←abcdefg ファイルサイズ1KB Wtest.txt←書き込み用ファイル 上記のようなファイルがあり、バイナリでtest.txtを読み込みWtest.txtに書き込みたいと思っています。 その際に、1KBのtest.txtを5KBになるまでバイナリで「abcdefg」の後に0を代入したいのですがどう書けば良いのかわかりません。 FILE *fp, *fpw; char *fname = "test.txt"; char *fname_w = "Wtest.txt"; unsigned char buf[10000]; int size; fp = fopen( fname, "rb" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } fpw = fopen(fname_w, "wb"); if(fpw == NULL){ printf( "%sファイルが開けません\n", fname_w ); return -1; } size = fread( buf, sizeof( unsigned char ), sizeof (fp), fp ); /*ここに処理を追加したい*/ fwrite( buf, sizeof( unsigned char ), size, fpw);

  • reallocについて

    現在、領域を拡張しながら、 ファイルを読み込んで呼び元に返却するPGを作成しています。 reallocがうまくいかないので、試しに小さいのを作って みましたが、これだとreallocの2度目で落ちます。 100文字ずつ呼んでいるので、拡張も100文字ずつ行っています。 メモリ確保に失敗なら、まだ分かるのですが、 ちょっと理由がわかりません。 reallocを複数繰り返していることも問題だと思いますが、 まずは正常に処理を流したいと考えています。 よろしくお願いします。 ~~~~~~ソース~~~~~~~~ //ファイルを読み込んでから領域を確保する #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFF 100 int main() { FILE *fp; char tmp[BUFF+1]; char *str; int len = 0; fp = fopen( "c:/test.txt" , "rb" ); if(fp ==0){ printf("ファイルがありません\n"); return -1; } //領域を初期化 str = (char *)malloc(1); memset(str,'\0',sizeof(str)); while(feof(fp)==0){ memset(tmp,'\0',sizeof(tmp)); fgets(tmp,BUFF,fp); //領域を再確保 len += BUFF+1; if(NULL == ((char *)realloc(str,len))){ printf("メモリ確保エラー"); } //読み込んだ値を変数に追加 strcat(str,tmp); } printf("文字列\n\n%s\n",str); printf("長さ:%d\n",len); fclose(fp); return 0; }

  • C言語 複数ファイル操作について

    Cプログラミング初心者です。 論文などの何行も文章があるようなテキストファイル(ここでは1.txtとします)と、他に予め単語をいくつか登録しているテキストファイル(2.txt)を開き、1.txtを最初の行から一行ごとに読み込み、2.txtの中にある単語が1つでもその一行の文章中に含まれていたらその一行の文章を出力し、また次の行においても2.txtの中にある単語のいずれかが含まれているかどうかを調べて含まれている場合は出力…含まれていない場合は出力せずに次の行へ…といったようにこれを1.txt内の最後の行まで繰り返し行うプログラムを作りたいのですが、自分が作ったプログラムでは含む・含まない関係なく1.txt内の文章全てが出力されてしまいます。おそらく最初のwhile文あたりがおかしいのだろうという予想はつくのですがどのように直せばよいのかわからず悩んでいます。どなたか教えていただければ嬉しいです(;_:) #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = s1; p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); } } int main(void){ FILE *fp; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); scanf("%s", fname);   ←ここで1.txtを入力するとします fp = fopen(fname, "r"); while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); memset(str1, 0, N); fread(str1, 1, N-1, fp); if((fp = fopen(filename, "r")) == NULL){ fprintf(stderr, "%serror.\n", filename); exit(EXIT_FAILURE); } while(fgets(str2, N, fp) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ a = 1; printf("%s\n", str1); break; } } if(a==0){ return 0; } fclose(fp); } return EXIT_SUCCESS; }

  • 何バイトめか調べる

    これは、指定したテキストに整数3があった場合、 ファイル先頭から何バイトか調べるプログラムです。 実行しても何も表示されませんでした。 どこが間違ってるか教えてください。 a.txtに、abcdefghij123  と書かれているとします。   FILE *fp;   int ch,val=3;   fp=fopen("a.txt","rb")   while( !feof (fp) ){      ch=fgetc(fp);      if(ch==val)      printf("%ld", ftell(fp) ); }           fclose(fp);      return 0; }