• ベストアンサー

ワードのデータ

FILE *fopen( const char *filename, const char *mode ); を使って、 FILE *fp = fopen("あああ.doc", "rb" ); --- c = fgetc(fp); ----- ---- として、エクセルのファイルデータを メモリーに移そうとしたら、 5文字文くらい読んで、 すぐに終了してしまいます。 1.原因は何でしょうか?   ワードデータの特性でしょうか? 2.他の方法でファイルサイズをはかり   EOF にかかわらず、そのサイズ分だけ読み込めば   データをメモリーに移せるのでしょうか?  よろしくお願いいたします。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

よくある落とし穴ですが、 char c; FILE *fp = fopen("あああ.doc","rb"); --- c = fgetc(fp); --- for (;;) {   if (c == EOF) {     break;   } ---   c = fgetc(fp); } fclose(fp); と言うコーディングをしていませんか? 変数 c が char 型だと、文字 0xff を読み込んだ時点で 変数 c が EOF と同値の (char)-1 になり、判定式 (c == EOF) が true と判定され、終了します。 int ic; char c; FILE *fp = fopen("あああ.doc","rb"); --- ic = fgetc(fp); --- for (;;) {   if (ic == EOF) {     break;   }   c = (char)ic; ---   ci = fgetc(fp); } fclose(fp); 上記のように fgetc の戻り値を int 型変数に格納すれば、文字 0xff を読み込んでも判定式 (ic == EOF) は true とならず、途中で終了したりしません。

uyama33
質問者

お礼

ありがとうございます。 バイナリで開いているので、 原因は別かなと思います。 コードは以下のようになっています。 arg[2] には、ファイル名があります。 FILE * stream1; if( (stream1 = fopen( argv[2], "rb" )) == NULL ) printf( "ファイル 'encrypt0.bin' は開けませんでした。\n"); else printf( "ファイル 'encrypt0.bin' が開けました。\n" ); fseek(stream1,0,0); int c; char bufp[25600]; int i = 0; do{ c = fgetc(stream1); bufp[i]=c; i=i+1; }while(c!=EOF); bufp[i-1]=NULL; for(int j=0; j<(kk/8+2); j++){ bufp[j+i] = NULL; } です。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 に補足しますが, そもそも getchar や fgetc などは全て int を返り値として持ちます. ですから, これらの関数の返り値を受け取る変数は同じく int で宣言しなければなりません.

uyama33
質問者

補足

ありがとうございました。 読み込んだ後の処理が 間違っていました。

関連するQ&A

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

  • FILE*のfopenの素朴な疑問

    fopenの定義をいかに記します。 FILE *fopen(const char *filename, const char *mode); filenameはconstで定義されることを要求されております。 が以下の内容はコンパイルできます。 int main(int argc, char** argv) { FILE* ftemp; ftemp = fopen( argv[1], "r" ); } この場合、argvはconstではありません。 constの必要性ってありますか?

  • fgetcの返却値 EOFについて

    C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが あり読みにくいと思います。 fgetc関数の返却値についてのお伺いします。 EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。 ここで、質問なのですが、2つの違いを判断することは可能でしょうか? 私が行った作業は あるファイル内の文字を1文字づつ読み込んで。 文字の種類ごとに指定したbufferferに格納させたいと思っています。 しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で 場合分けができない為うまくできません。 #include <stdio.h> #include <ctype.h> char buffer[100]; char *filename="TestFile"; char* main(){ static FILE *fp = NULL; char *p = buffer; int c; if ( fp == NULL ){ if ((fp = fopen( filename, "r" )) == NULL ){ fprintf(stderr,"can not open file %s\n", filename); return ( (char *)NULL ); } } c = fgetc(fp); while(1){ switch(c){ case '\n': case '\0': *p = '\0'; return( buffer); /*以下のcase EOF の時に2通り考えられる*/ case EOF:/*読み込み終了*/ *p = '\0'; return( buffer); /* case EOF:/*読み込みエラー fprintf(stderr, " OPEN _ERROR %s\n", filename); fclose(fp); fp = NULL; return ( (char *)NULL ); */ default: *p = (char)c; p++; } c = fgetc(fp); } } 以上です。 このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。 よろしくお願いします。

  • Officeファイルの送受信

    CSocketを使って、Serverとのネットワークプログラムを 作成していますが、ファイルの送受信が上手く出来ず、困っています。 Server側で指定ファイルデータを読み込み、 Client側でファイルを作成し、オープンすると 中身が壊れていますとメッセージが出てしまいます。 下記は、ファイル送受信のためだけに、 暫定的に組んだソースの抜粋になります。 /* Server側のCAsyncSocket派生クラスのSend関数 -------------- */ int CServerSocket::Send( int nFlags ) { FILE *fp; char *pBuffer; fp = fopen( "C:\\a.doc", "rb" ); /* ファイルサイズを取得する */ long current = ftell( fp ); fseek( fp, 0, SEEK_END ); long size = ftell( fp ); fseek( fp, current, SEEK_SET ); /* ファイルデータ読み込み */ pBuffer = new char[size]; fread( pBuffer, sizeof(char), size, fp ); fclose( fp ); return CAsyncSocket::Send( pBuffer, size, nFlags ); } /* Client側のCSocket派生クラスのOnReceive関数 -------------- */ void CClientSocket::OnReceive( int nErrorCode ) { char aaa[22529]; while ( true ){ n_read = Receive( aaa, 22528 ); received += n_read; if ( received >= 22528 ) break; } Close(); ShutDown(); FILE *fp; fp = fopen( "C:\\test.doc", "wb" ); fwrite( aaa, sizeof(char), 22528, fp ); fclose( fp ); } ※テスト版ということで、Client側では、とりあえず、送信サイズ(ファイルデータサイズ)は  分かっているので、固定にしています。 このような送受信では、Officeファイルの送受信はうまく行かないものなのでしょうか?(ちなみにtxtファイルは上手く行きました)

  • VC++のfopenのファイル名の指定方法について

    下記のようなcsvファイルを間引くプログラムを改変したいと思っています。 環境はVS2008 C++ コンソールアプリケーションです。 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { FILE *fp,*fp1; int i, j, retu, ch, cnt=0; char data[100]; char a=0; fp=fopen("data.csv","r"); fp1=fopen("kekka.csv","w"); cnt=0; retu=0; while (1){ ch=fgetc(fp); if (ch=='\n') break; } while((ch=fgetc(fp))!=EOF){ data[retu]=ch; retu++; if (ch=='\n'){ cnt++; if (cnt>=10){ cnt=0; for(i=0;i<retu;i++){ printf("%c",data[i]); fputc(data[i], fp1); } } retu=0; } } return 0; } ただ毎回csvファイルの名前をdata.csvに書き換え、さらにkekka.csvを別名にして保存しなければいけないためとても手間です。 そこでその部分を実行時にscanfなどを用いて変更したいと思ったのですがうまくいきません。 fopenでファイル名を実行時(ビルド時)に変更するにはどうすればよいのでしょうか。 ご教授お願いします。

  • データを読み込み

    データを読み込んで、表示するというものですが、 実行するとなぜか各行を読み込んだあとに 改行が入ってしまいます。 わかる方は何かアドバイスをお願いします。 ===================================== #include <stdio.h> #include <stdlib.h> #include <string.h> char filename[15], string[81]; main(){  FILE *fp = 0;  printf("input file:");  scanf("%s", filename);  if( (fp=fopen( filename, "r")) == NULL ){   printf("%s:don't open file", filename );   exit( 1 );  }  while(fgets( string,81, fp ) != NULL ){  printf("%s", string);  }  fclose( fp );  return 0; } =========================== test.dat : 80byte/rec =========================== 01234567890123456789012345678901234567890123456789012345678901234567890123456789 00000000000000000000000000000000000000000000000000000000000000000000000000000000 11111111111111111111111111111111111111111111111111111111111111111111111111111111

  • バイナリファイルの読み込み(C言語)

    raw(音楽ファイル)データを配列rawに読み込みたいのですが,バイナリファイルの読み込み方がわかりません. サンプルで以下のようなソース(途中略)があるのですが, ・なぜrawの型としてshortを使っているのか ・データ数の半分(file_size = ftell(fp) / 2)しか読み込んでいない ・fgetc(fp) << 8 あたりの意味がわからないので教えて下さい. -------------------------------------------------------- short *raw; if((fp=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "can't open %s.\n", argv[1]); exit(1); } fseek(fp, 0, SEEK_END); file_size = ftell(fp) / 2; fseek(fp, 0, SEEK_SET); raw = (short *)malloc((size_t)(file_size * sizeof(short))); if(raw == NULL){ fprintf(stderr, "malloc error\n"); exit(1); } for(i=0;i<file_size;i++) raw[i] = (short)((fgetc(fp) << 8) | fgetc(fp)); -----------------------------------------------------

  • データの区切り?

    こんにちわ。前回質問に御答え頂いて誠に有難う御座います。 さて、今回の質問なんですが、文字列の分割の方法が分からなくて困っています。 以下プログラムです。 //////////////////////////////////////// /*make_date.cpp*/ #include <stdio.h> #include <string.h> #define MAX_LEN 1000 #define MAX_LEN2 1000 #define BUFFER_SIZE 200 int main() { int i, len, cnt = 0; char *cp2; //「カテゴリー」「更新日」「職種」「登録日」 const char *delim2 = ":"; //改行用単語1 const char *delim3 = "@D"; //改行用単語2 const char *delim4 = "@P"; //改行用単語3 const char *delim5 = "@A"; //改行用単語4 const char *delim6 = "@Q"; //改行用単語5 const char *delim7 = "@W"; //改行用単語6 const char *delim8 = "@Z"; //改行用単語7 const char *delim9 = "@C"; //改行用単語8 const char *delim10 = "@T"; //改行用単語9 char buffer[BUFFER_SIZE]; char aiu[100]; char *wordss[MAX_LEN2]; FILE *fp,*pf; //ファイルポインタ //---------------------------------------------------- //各項目を選ぶ処理(カテゴリ) if((fp=fopen("data.dat","r")) == NULL ){ printf( "datファイルが存在しません。\n" ); } wordss[0] = fgets( aiu, 256,fp ); cp2 = wordss[0]; //そして、保存の為、取得したデータを「entry.bk」に入れ込む。 pf=fopen("entry.txt","w"); //区切り処理1 wordss[0] = strtok(cp2, delim9); //文字列に代入されている状態を確認 printf( "\n\n%s", wordss[0] ); //書き込み処理 fputs(wordss[0],pf); cp2 = NULL; //ファイル・クローズ fclose(pf); //ファイル・クローズ fclose(fp); return 0; } //////////////////////////////////////// /*data.dat*/ 20080714@TSE@C20080816@Z公開20090201@WSE@Q20090205@Aテスト20090206@PSE@D20090206:会議 //////////////////////////////////////// 現在このようなプログラムがあります。 「ddata.dat」の中にある文字列の【20080714】だけを取り出し、 「entry.txt」へ書き出します。(「delim10」を使用し「@T」があったら、改行します。) 次に【SE】だけを取り出し、 「se.txt」へ書き出す処理を作成中なんですが、 試しに【SE】を書き出すのかチェックするため「delim9」を使用し、試してみましたが、書き出されるのが【20080714】になってしまいます。 これを【20080714】【SE】【20080816】と書き出すにはどのようにしたら良いでしょうか? 説明が分かり難く申し訳御座いませんが宜しくお願いします。 タイトルも分かり難く申し訳ないです・・

  • ファイルの出力先がうまく指定できません。。

    今、ファイルの出力先を変更させたいと思っていて、 調べたところ、fp=fopen("フォルダ名/test.txt","wb") のようにすればよい、というところまでは調べたのですが、 私の場合、ファイル名を、filenameというchar型の変数に入れており、 fp=fopen(filename,"wb")となってます。 これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、 これではダメでした。 ファイル名の入っている変数はそのまま使いたいのですが、 それでパス指定をする方法ありますでしょうか?

  • ヘッダファイルでのFILE型引数宣言について

    下記の(1)、(2)のファイルについての質問になります。 (1)cファイル #include <stdio.h> /******************/ /* 表示モード処理 */ /******************/ void view_mode( FILE *fp_in ) ^^^^ { char data; while( 1 ){ /* ファイルから1文字読込み */ data = fgetc( fp_in ); /* ファイルの終了かをチェック */ if(data == EOF ){ break; } /* 表示処理 */ printf( "%c", data ); } return; } (2)ヘッダファイル void view_mode( FILE *fp_in ); ^^^^ ◆質問内容 (1)にview_modeの処理を書き、(2)にview_modeのプロトタイプ宣言をしていますが、 (1)はコンパイルが通るのですが、(2)はコンパイルが通りません。 エラー内容を見ると、 エラー E2147 testddga.c 1: 引数宣言は 'FILE' で始められない と表示されてしまいます。 (1)では、引数宣言にFILEを使用しているのにコンパイルが通り、 (2)では、何故かはコンパイルが通らないので、疑問に思っております。 お手数ですが、ご教授の程お願いたします