• ベストアンサー

txtファイルの読込み時に1033文字を超えると

txtファイルをfopen_s関数にモード"r"で読み込んでいます。 それをwhile (fgets(~~) != NULL) { ~ } で 1行ずつ読み込んでいるのですが、 この時1行の文字数が半角1033文字を超えていると 1034文字目からが「2行目扱い」になり 予期せぬ困った挙動を起こしてしまいます。 (Windowsのメモ帳では1035文字目から無理矢理改行表示されますが) なぜこの様な事が起こるのでしょうか? どうやって回避するのが一般的なのか教えて頂けますと幸いです。 ※OS:WindowsXP  コンパイラ:Visual C++2008 EE

noname#202167
noname#202167

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

  • ベストアンサー
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

fegtsで指定しているバッファのサイズはいくらですか? >Windowsのメモ帳では1035文字目から無理矢理改行表示されますが 1034文字がCRLF(X'0D0A')では無いですか。

noname#202167
質問者

お礼

>fegtsで指定しているバッファのサイズはいくらですか? 一度も変える事なく1024をずっと使っておりました・・orz 1033という位置がメモ帳で改行があるから改行コードが入るか 何か仕様でもあるのかと早とちりしてしまい orz ご回答、ありがとうございました。無事解決しました。

その他の回答 (1)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

ソースコードを貼り付けるのが、最善と思われ。 1034文字以降でも普通に読み込めるので、なんとも回答の仕様がない。

noname#202167
質問者

お礼

私も以前読み込めた経験が有るハズなのに・・? と思いつつなぜか早とちりを・・orz ご回答、ありがとうございました。

関連するQ&A

  • fgetsの処理を詳しく説明してください、お願いします。

    char line[100]; (stream = fopen( "test.c", "r" )) == NULL; while( ( fgets( line, 100, stream ) != NULL)){ printf( "%s", line); } fclose( stream ); 上記のコードでファイルが一行ずつ表示されるのですがなんとなくでfgetsを使っていたのでwhile文中のfgetsの動きがよく分かりません。 初めに改行文字までの一行を読み込むのはわかるのですが、何故繰り返すときlineに2行目、3行目、・・・ と取り込むのかがわかりません。 よろしくお願いします。

  • fgetsで2行目から文字化け

    fgetsでファイルを一行ずつ読み込みたいのですが、二行目以降が文字化けしてしまいます。 ******* ソース ******* #include <windows.h> #include <stdio.h> FILE *fp; if ((fp = fopen("textlist.txt", "r")) == NULL){ MessageBox(NULL, TEXT("ファイルを開けません"), NULL, NULL); exit (1); } while (1) { TCHAR buf[128] = {0}; if (fgets(buf, sizeof(buf), fp) == NULL) break; MessageBox(NULL,buf,NULL,NULL); } fclose(fp); ***** textlist.txt ***** あいうえお かきくけこ さしすせそ メッセージボックスの一回目は正しく"あいうえお"と表示されますが、二回目・三回目は文字化けしています。 最終的に一行ずつ分けて配列に入れたいので、fgetsで出来たらと思っています。 よろしくお願いします。

  • 同一ファイルからの文字列検索

    お世話になります。 今、ファイル処理を勉強しています。 hoge.txtに文字列が格納されています。 (hoge.txt) --------------------- suzuki yamada kimura tanaka ito suzuki kimura --------------------- hoge.txtの上の行より、下に検索を行い、 一致した場合、printf("HIT\n");と出力します。 動きは、 suzukiを検索文字列し、yamada~kimuraまで検索を行い、 もしヒットした場合、出力表示します。 suzukiが検索終了すると、次のyamadaを検索文字列として、 kimura~kimuraを検索します。 この動作を最後の行まで行えば終了です。 下記のfgets()で1行分を取得してからの 次の行への移行がわかりません。 FILE *fp; char name[256]; if( (fp =fopen( "hoge.txt", "r )) == NULL ){ return 0; } while( fgets(name, sizeof(name), fp ) != NULL ){ //ここで次の行以下とstrstr()で比較を行う } お手数をお掛けしますが、よろしくお願い致します。

  • 改行されたtxtファイルの読み込み(C++)

    3374356,4785323,7043817,5111179,8267572, 6486903,3258714,6344689,8620512,7434933, 8088837,8231528,6524254,5928445,7101798, 5338215,5233711,4753647,5930266,7512232, 5343749,5813061,6439450,6257874,5724787, 5864114,9006652,4871427,6158077,7343041, 7615426,7168142,5866379,8154664,7342803, という形式のデータ数1000のtxtファイルがあります。 解析に使用したいのでCに読み込みたいのですが、方法が調べても分からず困っています。とりあえず以下が、データが一行の際に使用しているソースコードです。 FILE *fp; char linebuf[4096]; char *p; int array[1024]; int data=0; fp=fopen("randombetarev.txt","r"); if(!fp) return 1; fgets(linebuf,4096,fp); fclose(fp); p=strtok(linebuf,","); do{ array[data]=atoi(p); data++; }while(p=strtok(NULL,","));//ここまででデータを配列に格納 これでは改行の判別ができないので初めの一行目のデータしか読み込めません。どなたかご教授ください。

  • ファイル読み込み処理  ???

    1,a,aa,12 2,b,bb,13 3,c,cc,14 4,d,dd,15 5,e,ee,ff 上のようなファイル内容を 読み込込んで 1,a,aa,12 2,b,bb,13 3,c,cc,14 4,d,dd,15 5,e,ee,ff  ように表示したいです。 4行目が空欄ですので4行目を飛ばして読み込んで表じしたいです。 どこを修正すればいいですか? #include <stdio.h> #include <string.h> int main(void) { FILE *fp1; char string[128]; /* 文字列を読み込む配列 */ /* ファイルを開けなかったら */ if ((fp1 = fopen("test.txt", "r")) == NULL) { fprintf(stderr, "ファイルを開けません!\n"); return -1; } /* ファイルから失敗するまで行単位で文字を読み込み */ while ((fgets(string, 128, fp1)) != NULL) { string[strlen(string) - 1] = '\0'; /* 余分な改行コードを削除 */ puts(string); /*読み込んだ行を表示 */ } fclose(fp1); /* ファイルを閉じる */ }

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

    ファイルを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--- オレンジ みかん

  • 続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--- オレンジ みかん

  • 初心者です。WINAPIでの文字列の取り込みについて

    今 if((stream=fopen("words.txt","r"))==NULL){ return 1; } while((fgets(line,256,stream))!=NULL){ ・ wsprintf(mon, "表示:\"%s\"", line); ・ のようにしてファイルから一行ずつ取り込んでいるのですが, TextOut(hdc, 0, 0, mon, (int)mon()); 表示されるのが 表示:"see↑"(最後に半角の↑見たいな物が入ってるのですがなんなのでしょうか? また"see"だけなどを格納するにはどうすればいいのでしょうか教えて下さい。

  • テキストファイルの文字列の削除

    1行あたりIPアドレスが1つ書いてあるテキストファイルから、指定したIPアドレスを削除するプログラムを作成しています。 r+モードでfoepnした後にfgetsで一行ずつ読み取り、指定されたIPアドレスかどうかをチェックし、該当すればその行をNULLで埋め尽くしているのですが、サクラエディタなどで開くとその行が削除ではなくNULL文字で埋め尽くされているといった現象になります。 削除するにはどうすればよいでしょうか? ipaddress.txt --------------------- 192.168.0.1(\n) 192.168.0.2(\n) 192.168.0.3(\n) --------------------- 以下、コード bool DeleteAllowIP(char *ipaddr) {   FILE *fp;   char szBuf[256];   int leng = 0;   long posi=0;   // 初期化   FillMemory(szBuf, sizeof(szBuf), 0);   // ファイルオープン(追記)   if(fopen_s(&fp, AllowPath, "r+"))     return FALSE;   // 削除   while (NULL != fgets(szBuf, sizeof(szBuf), fp)){  // 1行読み取る     if(NULL != (strstr(szBuf, ipaddr))){  // 削除IPに合致するIPを検索       fseek(fp, posi+1, SEEK_SET);  // 削除する先頭行セット       leng = strlen(szBuf) - 1;  // 改行を除く文字数を取得       while(leng>=0){   // 文字数分'\0'をセット         fseek(fp, posi+leng-1, SEEK_SET);         leng--;         fputc('\0', fp);       }       fseek(fp, posi+1, SEEK_SET);  // 次の行の先頭にセット     }     posi = ftell(fp);   }   // ファイルクローズ   fclose(fp);   return TRUE; }

  • [初心者です]Cでのファイル読み込み

    初めまして。質問させていただきます。 プログラミング初心者でコンパイラはgccです。 テキストファイルに書かれた10行の文字列をfgetsを使って読み込みたいので、 以下のようなプログラミングを組みました。 int i=0; char data[256]; char* dataname[256]; char filename[] = "datatext.txt"; FILE* fp = fopen( filename, "r" ); if(!fp)printf("error"); while( fgets(data, 256, fp) != NULL ) { dataname[i]=data; printf("%s",dataname[i]); i++; } fclose(fp); return 0; と、これはうまくいったのですが(初心者ゆえに)本当に上手くいってるのかと思い、 いろいろプログラミングを書き換えて確認していたら、 ・・・・・・・・・(上は同じ)・・・・・・・・・ while( fgets(data, 256, fp) != NULL ) { dataname[i]=data; i++; } fclose(fp); printf("%s",dataname[0]); printf("%s",dataname[1]); printf("%s",dataname[2]); ・・・ printf("%s",dataname[9]); return 0; とprintfの位置を変えると、表示が全て最後の行の値(dataname[9])になってしまいました・・・ これってメモリとかの関係?ですか?原因を知りたいです。 連休中ゆえ質問できる知人もおらず困っています。どうぞよろしくお願いします。

専門家に質問してみよう