• 締切済み

22年度基本情報技術者試験の午後のプログラムの問題について

22年度基本情報技術者試験の午後のプログラムの問題について 初めて受験しました。 結果は惨敗でした。 くやしくて、午後のプログラムの問題を家の環境(MicrosoftVisualC++2008ExpressEdition)で作ってみましたが、うまくいきません。 具体的には、linebufの中身がカタカナの「フ」の字がぎっしりつまってしまいます。 ソースは以下のようにしました。 #include <stdio.h> #define COLUMNS 80 /* 1行の最大文字数 */ void printout_text(char *); int main() { printf("VC++2008でプログラムを実行\n"); printout_text("file.txt"); return 0; } void printout_text(char *filename) { FILE *fp; char linebuf[COLUMNS + 1]; int ch, ch1, cpos = 0, gapp = -1, i; fp = fopen(filename, "r"); while ((ch = fgetc(fp)) != EOF) { switch(ch) { case '\n': linebuf[cpos] = '\0'; printf("%s\n", linebuf); cpos = 0; gapp = -1; break; case ' ': if (cpos <= COLUMNS) { linebuf[cpos] = '\0'; printf("%s\n", linebuf); cpos = 0; } gapp = cpos; linebuf[cpos++] = ch; break; default: if (cpos <= COLUMNS) { i = gapp + 1; ch1 = linebuf[i]; linebuf[i] = '\0'; printf("%s\n", linebuf); cpos = 0; if (i < COLUMNS) { linebuf[cpos ++] = ch1; i++; while (i < COLUMNS) { linebuf[cpos++] = linebuf[i++]; } } gapp = -1; } linebuf[cpos++] = ch; } } if (cpos > 0) { linebuf[cpos] = '\0'; printf("%s", linebuf); } fclose(fp); }

みんなの回答

  • pac-pac
  • ベストアンサー率21% (9/42)
回答No.3

ファイルオープンは「本当に」成功していますか? fpがNULL(失敗)になっていませんか? 普通だったら、 fp = fopen(filename, "r"); の後に if(fp==NULL){ /* ファイルオープン失敗時の処理 */ }else{ /* ファイルオープン成功時の処理 */ } のような感じになると思います。 画面に"フフフ・・・"が表示されているあたりからも、 ファイルオープンに失敗している それにも関わらず(オープンできているつもりで)処理が続けられている ような気がします。

Momoda
質問者

補足

普通につくろときは、ファイルオープン時の確認があったほうがよいですよね。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

空欄aの正解は「イ cpos <= COLUMNS」ではなく「エ cpos >= COLUMNS」です。

Momoda
質問者

お礼

22年度春の過去問が発売されてたので、買ってきて確認しました。 cpos <= COLUMNS の部分間違っているようでした。 ご指摘頂きありがとうございます。

Momoda
質問者

補足

おかげで、フフフが表示されなくなり、普通に文字が表示されるようになりました。

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

file.txtの内容はどうなってますか?

Momoda
質問者

補足

file.txtの内容は、以下になります。 file.txt---------------------------------- This demonstrates the dynamic and rapidly changing conditions in which

関連するQ&A