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

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

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

test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。 何かよいアドバイスをお願いします!m(_ _)m 例 test.txt --------------------------------- 私の一番好きな食べ物はリンゴです。 --------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ test1.txt ---------------------------------- 私の一番好きな 食べ物はリンゴ です。 ----------------------------------

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

  • ベストアンサー
  • 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

  • C言語でファイルの入出力

    C言語についての質問です。 統計学のシュミレータを作っていまして 大量の数値データ(1000程度)のデータを入力する必要があるのですが scanfなどで入力要求するには、数に無理がありますので 外部テキストファイルからプログラムに読み込みたいのですが 方法が分かりません。 希望としては、まずテキストファイルに 1000個の数値データを入力しておいて (数値データのみをコンマとか改行で区切ったものをあらかじめ作成しておく) それを1000個の配列 int data[1000]に 順番にインポートできるようにしたいです。 データ数は1000個で固定、すべてint型でOKです。 数値として処理したいので 文字列としてインポートしてしまうのはダメです。 あくまでint型の数値として考えてください。 回答よろしくお願いします。

  • c言語:ファイルの入出力

    2つの行列をファイルから読み込み、その積をファイルに出力するプログラムを 作りたいのですが、参考書を読んでもよくわからないので教えて頂きたいです。 テキストファイルの文字列のコピーなどは、参考書を見てできたのですが、 ファイル入出力を使った数値の計算がいまいち理解できませんでした。 注意点は以下の通りです。 ・ファイルはカンマ区切りのテキストファイルとし、入力ファイルはエクセルで作成。拡張子は.csv。 ・ファイル名はキーボードから入力できるようにする。 よろしくお願いします。

  • C言語でテキストファイルのデータ処理

    はじめまして。 僕はC言語に関して全くの初心者です。 どうぞよろしくお願いします。 例えば、 1,0,0,7,6 2,0,0,5,5 3,1,0,4,9 : : のようなテキストファイル、test.txtがある時、 1行目の4カラム目(7)と5カラム目(6)を、 それぞれの行について差し引くプログラム、 つまり全ての行について4カラム目は7を引き、 5カラム目は6を引くプログラムの事で、 この例では、 1,0,0,0,0 2,0,0,-2,-1  3,1,0,-3,-3 : : となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。 ちなみにawkで書いて実行すると、 (プログラム名はtest.awkとする) BEGIN{ i=0; } { while(i<1){ v3 = $4; v4 = $5; i++; } print $1,$2,$3,($4 - v3),($5 - v4); } 実行するプログラム↓ awk -f test.awk test.txt という感じなのですが…。 これを上述の様に、C言語でプログラムを書いて、 実行するには、例えばどのようなプログラムを書けば いいのでしょうか? なにぶん初心者のため、分からない事だらけですが、 よろしくお願いしますm(__)m

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • c言語について教えてほしい

    教えてください。 現在c言語を自習していますが、偶然にこういう問題を見ましたが、なかなか解けなくて、助けがほしいです。お願いします。 問題: fopen,fputs,fcloseを使って、次のプログラムを作成しなさい。文字列とファイル名を入力させ、ファイルを生成する。(入力したファイル名に拡張子.txtを付与する。) 表示イメージ: 文字列を入力して下さい。 ファイル書き込みテストをします。注意します (←入力する) ファイル名を入力して下さい。 testei (←入力する) ファイルの書き込みに成功しました。 ファイルイメージ: testi.txt (←入力したファイル名 拡張子.txtが付与される) ファイル書き込みテストをします。注意します (←入力した文字列)

  • ファイルの入出力をするプログラム

    1週間前からJAVAを勉強しております。 簡単な練習で、テキストファイル(test.txt)に縦一列に並んでいる数字を読み込み別のテキストファイルに書き込むプログラムを作っておりますが FileInputStream file = new FileInputStream("test.txt"); file.read(buf_byte); for(i=0;i<=10;i++)buf_char[i]=(char)buf_byte[i]; という感じで恐らく回りくどいことをしてると思いますが、ダイレクトに文字を読み込む方法がわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 【C言語】テキストファイル内のデータを一行削除

    いつもお世話になっております。 ファイル操作についてご教授ください。 sample.txtに下記のデータが格納されています。 【sample.txt】 ------------------- りんご 100円 バナナ 120円 苺 150円 ------------------- この状態で、scanfで「バナナ」と入力し、 sample.txtからバナナの行を削除し、 行を詰めるようにしたいのですが、 どのようにしたらいいのでしょうか。 【流れ】 "文字を入力してください"のメッセージ。   ↓ 「バナナ」と入力。   ↓ ------------------- りんご 100円 苺 150円 ------------------- 上記のように、scanfで入力した「バナナ」の行が削除され、 行が詰められている上状態にしたいです。 超が付くほどの初心者なので、 ソースも書いていただけると幸いです。 どうぞ宜しくお願い致します。

  • C言語

    課題なんですが、C言語で 「文字列と正数nをキーボードから入力して、1行n文字で改行するプログラム」 をつくりたいのですが、わかりません。どうすればよいのですか?

  • C言語についてです。

    C言語についてです。 次のようなテキストファイルがあるとします。 ------------------------------------- Sample.txt ------------------------------------- 項目一  項目二  項目三 1      2     1 2      1     3 3      3     1 ------------------------------------- 一行目が文字列、2行目以降が整数というファイルです。 このファイルを読み込み、1行目の文字列を表示し、2行目以降を読み込んでn行3列の配列に入れ更に表示したいのですが、どのように書けばいいのでしょうか? 宜しくお願いします。

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

専門家に質問してみよう