- ベストアンサー
C言語 ファイル入出力について
- プログラムを作りたいのですがどうもうまくいきません。
- 何かよいアドバイスをお願いします
- test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#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; }
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。 そうですか・・(;_;) #2>(0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC); この部分は、SHIFT_JIS の1バイト目を判定するものです。 日本語の文字コードとして、SHIFT_JISが使われていると想定しています。 1バイト目が該当するとき、無条件に2バイト目を出力しています。
お礼
なんか色々やったら出来るようになりました! ありがとうございました!
- Trick--o--
- ベストアンサー率20% (413/2034)
テキストが英字(一バイト文字)だけなら 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)
手元の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)
7文字毎に改行する方法ならば以下でどうでしょう。 strlenを使う必要はないです。 0. 書き出し用バッファを初期化する。 1. ループして、読み込んだ文字を1文字ずつ書き出し用バッファに追加する。 2. 7文字出来たらループを抜ける。 3. 改行文字を書き出し用バッファに追加。 4. 読み込む文字がまだあるのならば1.に戻る。 5. 読み込む文字が終了したら書き出しバッファの内容をtest1.txtに書き出す。 1.のところでは半角、全角の処理をきちんとやってくださいね。
お礼
まずは、こんな夜分にお返事をして下さってありがとうございます。質問欄に記述し忘れたのですがC言語は素人同然なのでまたいくつか質問させていただきます。 書き出し用バッファとは何でしょうか? また、半角・全角の処理をきちんとやると言うのはどういう事でしょうか? 何卒、よろしくお願いします。
お礼
返答ありがとうございます。このプログラム通りに入力してみましたところ、半角はうまく7文字ごとに改行されて出力したのですが漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。 そこで質問なのですが (0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC); この文はなにを意味しているのでしょうか? 私としてはここに原因があるものと考えています。 何卒よろしくお願いします。