ここから本文です

c言語で(コンマ),で区切られた整数値が入っている。このファイルを読み込み、書か...

mor********さん

2018/10/1315:15:32

c言語で(コンマ),で区切られた整数値が入っている。このファイルを読み込み、書かれている整数値とその合計を画面に出力するプログラムを作りなさい。

ファイルの内容例:
10,3,7,8

出力結果:
10
3
7
8
----------
合計:28

って問題があったんですけど解答例が知りたいです。

補足僕が途中まで考えたコードは
#include<stdio.h>

int main(void){
FILE *file_05;
int ret;
int num = 0;

if((file_05=fopen("nums.txt","r"))==NULL){
printf("ファイルが存在しません\n");

}

while((ret=fgetc(file_05)) != EOF){
if(ret == ','){
printf("\n");
}
else{
num += ret;
printf("%d",ret);
}
}

printf("\n");
printf("------------------\n");
printf("合計:%d\n",num);
fclose(file_05);

return 0;
}
結果が
4948
51
55
5610
------------------
合計:269
になってわからなくなりまいした。。。

閲覧数:
114
回答数:
5
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

久遠人さん

2018/10/1414:06:56

>type test.c
#include <stdio.h>
main()
{
FILE *fp;
int d,s = 0;
puts("出力結果:");
fp = fopen("test.dat","r");
while(fscanf(fp,"%d%*c",&d) == 1) {
printf("%d\n",d);
s += d;
}
fclose(fp);
printf("----------\n合計:%d\n",s);
}

>cl test.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.14.26430 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
Microsoft (R) Incremental Linker Version 14.14.26430.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

>type test.dat
10,3,7,8
>test
出力結果:
10
3
7
8
----------
合計:28

質問した人からのコメント

2018/10/14 23:35:45

コンパクトで見やすいコードでしたので、ベストアンサーに選ばせていただきまいした!

時間を割いて、回答してくださった皆さん、ありがとうございました。

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

umi********さん

2018/10/1320:50:43

こんな感じでどうかしら?


#include <stdio.h>

#define FILE_NAME "nums.txt"

int main()
{
__char buf[2];
__FILE *fp;
__int n;
__int sum = 0;

__if ((fp = fopen(FILE_NAME, "r")) == NULL){
____fprintf(stderr, "ファイル %s をオープンできません。\n", FILE_NAME);
____return -1;
__}

__while (fscanf(fp, "%d", &n) == 1)
__{
____sum += n;
____printf("%d\n", n);

____if ((fscanf(fp, "%1s", buf) != 1) || (*buf != ',')){
______break;
____}
__}

__puts("----------");
__printf("合計:%d\n", sum);

__fclose(fp);

__return 0;
}

プロフィール画像

カテゴリマスター

n2q********さん

編集あり2018/10/1410:42:56

《例》

#include <stdio.h>
#include <ctype.h>

int main(void) {
FILE * const file_05 = fopen("nums.txt", "r");
if (file_05) {
int ch = fgetc(file_05);
int sum = 0;
for (;;) {
if (isdigit(ch)) {
int value = ch - '0';
while (isdigit(ch = fgetc(file_05))) {
value *= 10;
value += ch - '0';
}
printf("%d\n", value);
sum += value;
} else if (ch == EOF) {
printf("------------------\n");
printf("合計:%d\n", sum);
fclose(file_05);
break;
} else
ch = fgetc(file_05);
}
} else
printf("ファイルが存在しません\n");
return 0;
}


《説明》

fgetc から得られる文字は、次のどれかであると考えられます。

① 数字
② EOF
③ その他の文字


コンマは数字でも EOF でもないので③として捉えることが出来ます。


コンマと更にそれ以外の文字とを区別して処理しなければならないかっていうと、要件の中にそのような話までは含まれていない。結局、その区別は何のためかワケが分からなくなってしまいます。コンマを特別扱いする必要が無いというわけ。


ですので if 文で isdigit の場合と、EOF の場合と、それ以外の場合の3つに分けました。


数字の場合、'0' を差し引くと本当の値が得られます。fgetc が返してきたのは文字コードですからね。本当の値ではありません。ですから '0' の文字コードを差し引いてやれば、とりあえず一桁分の本当の値が得られるという寸法。

2桁以上の場合もあり得るので、while 文によって更に fgetc を呼び出します。isdigitの戻り値が真である限り、value を 10 倍しながら ch - '0' を足し続けます。

これで何桁でも読み取れます。(int 型の範囲を越えなければ)


EOF の場合は、そこで終わり。

printf で合計を出力して break します。

prwssさん

2018/10/1318:16:44

>c言語で(コンマ),で区切られた整数値

一文字ずつ読み取るならば、こうなります


***


#include<stdio.h>

int main(void){
FILE *file_05;
int ret;
int i = 0;
int num;
char str[20];
int total = 0;
char fileName[] = "nums.txt";

if( (file_05 = fopen(fileName, "r")) == NULL){
printf("can not open %s\n", fileName);
return 1;
}

while( (ret = fgetc(file_05)) != EOF ){
if( ret == ',' ){
str[i] = '\0';
num = atoi(str);
printf("%d\n", num);
total += num;
i = 0;
}else{
str[i] = ret;
i++;
}
}

str[i] = '\0';
num = atoi(str);
printf("%d\n", num);
total += num;

printf("\n");
printf("------------------\n");
printf("total:%d\n", total);
fclose(file_05);

return 0;
}

2018/10/1316:28:05

こんな感じかなぁ?

#include<stdio.h>

int main(void){
FILE *file_05;
int ret;
char chr;
int num = 0;

if((file_05=fopen("nums.txt","r"))==NULL){
printf("ファイルが存在しません\n");
return 1;
}

do
{
fscanf(file_05,"%d",&ret);
num += ret;
printf("%d\n",ret);
}
while(fscanf(file_05,"%c",&chr)!=EOF && chr==',' );


printf("\n");
printf("------------------\n");
printf("合計:%d\n",num);
fclose(file_05);

return 0;
}

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる