質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

2484閲覧

c言語の課題に悩んでいます

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/16 04:47

###前提・実現したいこと
出力したファイル(a.txt)を読み込み、各行の合計値をファイル(b.txt)へ出力するプログラムを作成したいのですが上手くいきません。どなたか下記のプログラムを改善していただけないでしょうか。

###a.txt

a.txtファイルは1から999の数字を5つごとに改行しています。 1,2,3,4,5 6,7,8,9,10 11,12,13,14,15 ...999

###該当のソースコード

c

1#include<stdio.h> 2int main(){ 3 4 int a[5]; 5 6FILE *wfile; 7FILE *file; 8 9printf("合計値を出力しました\n"); 10 11wfile = fopen("a.txt","r"); 12file = fopen("b.txt","w"); 13 14while(fscanf(wfile,"%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF){ 15 16 fprintf(file,"%d\n",a[0]+a[1]+a[2]+a[3]+a[4]); 17} 18fclose(wfile); 19fclose(file); 20} 21

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2016/12/16 05:35

「上手くいきません」どうなることを想定していて、どういう結果になり、想定と結果にどういう差異があるのかを質問に記載してください。
guest

回答4

0

a.txtの最終行が、996,997,998,999なので、バッファを0クリアすると良いのでは?

c

1#include<stdio.h> 2int main(){ 3 4 int a[5]; 5 6 FILE *wfile; 7 FILE *file; 8 9 printf("合計値を出力しました\n"); 10 11 wfile = fopen("a.txt","r"); 12 file = fopen("b.txt","w"); 13 14 while(fscanf(wfile,"%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF){ 15 16 fprintf(file,"%d\n",a[0]+a[1]+a[2]+a[3]+a[4]); 17 a[0]=a[1]=a[2]=a[3]=a[4]=0; 18 } 19 fclose(wfile); 20 fclose(file); 21}

投稿2016/12/16 05:20

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

改善事項としては以下になります。

  • fscanf は引数分読み取ると続きから読み始めてしまうので fscanf をやめる
  • a は数値の個数によっては値が埋まらない場合があるので先に初期化する
  • sscanf で読み取った個数を確認する
  • この用途での EOF の使用が間違っているのでやめる
#include<stdio.h> int main() { int a[5]; FILE *wfile; FILE *file; int i; char buf[BUFSIZ]; printf("合計値を出力しました\n"); wfile = fopen("a.txt","r"); file = fopen("b.txt","w"); // fscanf は読み取り個数を超えると以降の読み込みを止めてしまうので // いったん1行分バッファに読み込む while(fgets(buf, BUFSIZ, wfile) != NULL) { // a の中身は初期化されていないので先に初期化する a[0] = a[1] = a[2] = a[3] = a[4] = 0; // fscanf や sscanf は読み取った個数を返すのでその個数が 0 になれば止める i = sscanf(buf,"%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4]); if (i == 0) break; fprintf(file,"%d\n",a[0]+a[1]+a[2]+a[3]+a[4]); } fclose(wfile); fclose(file); }

1行あたりの値の個数が5個限定ならばこれで良いですが、そうでないなら推奨されるコードではないのでご注意を。

投稿2016/12/16 08:02

編集2016/12/16 08:11
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a.txtファイルは1から999の数字を5つごとに改行しています。

だと、最終行は「996,997,998,999」と数字4つしかないので、必ず5つあると決めうちしているこのプログラムだと正しく処理できません。

fscanfの返値を見て、数字が何個であったかを知る必要があります。

最小限の手直しで済ませると、こんな感じ。

C

1int i, n, s; 2while((n=fscanf(wfile,"%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4]))!=EOF){ 3 for(i=0, s=0; i<n; i++) { 4 s += a[i]; 5 } 6 fprintf(file,"%d\n",s); 7}

投稿2016/12/16 05:42

編集2016/12/16 05:44
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ファイル(a.txt)は、数字を5つごとに改行されているのですから、改行までが1行分のデータです。
質問のコードは、fscanfで5つ目の数字までしか読みこんでいないのが原因で、うまくいかないのです。

fscanfで、最後の改行まで読みこむようにすれば、解決すると思います。

投稿2016/12/16 05:09

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問