• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ファイル入出力について)

C言語 ファイル入出力について

このQ&Aのポイント
  • プログラムを作りたいのですがどうもうまくいきません。
  • 何かよいアドバイスをお願いします
  • test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいです。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#include <stdio.h> int iskanji(unsigned char c){ //シフトJIS、1バイト目 //(0x81 <= c <= 0x9F あるいは0xE0 <= c <= 0xFC) return (0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC); } int main(void){ FILE *fin, *fout; int c; unsigned count=0; fin=fopen("test.txt", "r"); fout=fopen("test1.txt", "w"); while(EOF!=(c=fgetc(fin))){ fputc((char)c, fout); count++; if(c == '\n'){ count=0; } if(iskanji((unsigned char)c)){ fputc(fgetc(fin), fout); } if(count && count % 7==0){ fputc('\n', fout); } } fclose(fout); fclose(fin); return 0; }

yu-ta-
質問者

お礼

返答ありがとうございます。このプログラム通りに入力してみましたところ、半角はうまく7文字ごとに改行されて出力したのですが漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。 そこで質問なのですが (0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC); この文はなにを意味しているのでしょうか? 私としてはここに原因があるものと考えています。 何卒よろしくお願いします。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#2>漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。 そうですか・・(;_;) #2>(0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC); この部分は、SHIFT_JIS の1バイト目を判定するものです。 日本語の文字コードとして、SHIFT_JISが使われていると想定しています。 1バイト目が該当するとき、無条件に2バイト目を出力しています。

yu-ta-
質問者

お礼

なんか色々やったら出来るようになりました! ありがとうございました!

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

テキストが英字(一バイト文字)だけなら int main(int argc, char *argv[]) {  FILE *in,*out;  char szText[8];  if((in=fopen("test.txt","r"))==NULL) {   printf("test.txtが開けません\n");   return 0;  }  if((out=fopen("test1.txt","w"))==NULL) {   printf("test1.txtが開けません\n");   fclose(in);   return 0;  }  while(fgets(szText,8,in)!=NULL) {   fprintf(out,"%s",szText);   if(strlen(szText)==7)    fprintf(out,"\n");  }  fclose(out);  fclose(in);  return 0; } で出来るはずだけどね……

  • J_H
  • ベストアンサー率57% (11/19)
回答No.3

手元のBCC5.5.1 では正常だけど、 それ以外では正常かどうか確信が持てない 添削希望回答です。 アルファベットと日本語を同じ一文字と扱うために、setlocale () を使ってます。 #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(void){ setlocale(LC_NUMERIC,"jpn"); wchar_t* fn = L"test.txt"; wchar_t* output = L"out.txt"; FILE* fp = _wfopen(fn, L"r"), *fout = _wfopen(output, L"w"); if (fp == NULL){ fwprintf(stderr, L"ERROR: \" %s \" Not Found\n", fn); return EXIT_FAILURE; } wchar_t buf[8]; wchar_t* wct; while ( ( wct = fgetws(buf, sizeof(buf)/sizeof(buf[0]), fp) ) != NULL){ fwprintf( fout, L"%s\n", wct ); } fcloseall(); return EXIT_SUCCESS; }

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.1

7文字毎に改行する方法ならば以下でどうでしょう。 strlenを使う必要はないです。 0. 書き出し用バッファを初期化する。 1. ループして、読み込んだ文字を1文字ずつ書き出し用バッファに追加する。 2. 7文字出来たらループを抜ける。 3. 改行文字を書き出し用バッファに追加。 4. 読み込む文字がまだあるのならば1.に戻る。 5. 読み込む文字が終了したら書き出しバッファの内容をtest1.txtに書き出す。 1.のところでは半角、全角の処理をきちんとやってくださいね。

yu-ta-
質問者

お礼

まずは、こんな夜分にお返事をして下さってありがとうございます。質問欄に記述し忘れたのですがC言語は素人同然なのでまたいくつか質問させていただきます。 書き出し用バッファとは何でしょうか? また、半角・全角の処理をきちんとやると言うのはどういう事でしょうか? 何卒、よろしくお願いします。

関連するQ&A