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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

254閲覧

C言語でファイルを読み込み、各要素を取り出すコードのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/01/15 03:28

編集2018/01/15 04:34

###前提・実現したいこと
c言語でテキストファイルを読み込み、行としてではなく、各要素を出力しようとしています。
以下がコード作成のために参考にしているサイトです。
参考サイト

実現したいこと

%./trial trial.txt 2018/01/15,Jan,3,100 2018/01/16,Jan,4,400

###発生している問題・エラーメッセージ
実行すると以下のように表示され、実現したいことと大きく異なるのですが、どのように修正すればいいでしょうか。

%./trial trial.txt 2018/01/15,0.0,0.0,0.0,0.0,0.0 ,0.0,0.0,0.0,0.0,0.0 2018/01/16,0.0,0.0,0.0,0.0,0.0 ,0.0,0.0,0.0,0.0,0.0

###該当のソースコード
trial.txt

2018/01/15,Jan,3,100 2018/01/16,Jan,4,400

trial.c

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char *argv[]){ 5 FILE* fp; // file pointer 6 7 char tmpline[256]; // temporary space 8 9 char *fname = argv[1]; 10 fp = fopen(fname, "r"); // open a file 11 12 char date, month; 13 int num1, num2; 14 15 while(fscanf(fp, "%[^,],%s,%s,%d,%d", tmpline, &date, &month, &num1, &num2) != EOF) { 16 printf("%s,%s,%d,%d", tmpline, date, month, num1, num2); 17 } 18 19 fclose(fp); 20 return 0; 21}

###実行環境
ターミナル バージョン2.8
MaxOS High Sierra

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

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

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

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

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

episteme

2018/01/15 03:39

"実現したいこと"が明記されていない。期待する結果を記すべし。
退会済みユーザー

退会済みユーザー

2018/01/15 03:59

ご指摘いただきましてありがとうございます
guest

回答2

0

ベストアンサー

カンマ区切りに分解して読み込む想定でしょうか。
その前提ですが、項目数4個に対してsscanfの書式で指定しているのが5個あります。
また各項目に対して確保すべき変数の領域がいい加減過ぎます。
2018/01/15,Jan,3,100

2018/01/15 → 文字列で11バイト必要(変数dateは1バイト)
Jan → 文字列で4バイト必要(monthは1バイト)
3 → 数値
100 → 数値
更にprintfで指定している書式では4個ですが、5個のパラメーターがある。
以上を踏まえて修正すると以下。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char *argv[]){ 5 FILE* fp; // file pointer 6 7 char *fname = argv[1]; 8 fp = fopen(fname, "r"); // open a file 9 10 char date[11], month[4]; 11 int num1, num2; 12 13 while(fscanf(fp, "%[^,],%[^,],%d,%d\n", date, month, &num1, &num2) != EOF) { 14 printf("%s,%s,%d,%d\n", date, month, num1, num2); 15 } 16 17 fclose(fp); 18 return 0; 19}

投稿2018/01/15 04:19

編集2018/01/15 04:35
ttyp03

総合スコア16996

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

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

退会済みユーザー

退会済みユーザー

2018/01/15 04:24

ご回答いただきましてありがとうございます。 実行させていただいたところ、2018/01/15,Jan,3,100,,1869833334,1952802655 2018/01/16,Jan,4,400,,1869833334,1952802655 と出力されたのですが、後ろの2つの数字(1869833334,1952802655)は何を意味しているのでしょうか。
ttyp03

2018/01/15 04:26

修正版を更新しております(sscanfの箇所) そちらで再度試していただけますか。
退会済みユーザー

退会済みユーザー

2018/01/15 04:33

ありがとうございます。 実行させていただきましたところ、このように表示されました。 % ./trial trial.txt 2018/01/15,Jan,3,100 2018/01/16,Jan,4,400 ,Jan,4,400
ttyp03

2018/01/15 04:36

sscanfとprintfに\nを追加してみました。 どうでしょうか。
退会済みユーザー

退会済みユーザー

2018/01/15 04:39

解決しました。ご丁寧に解説・修正いただきましてありがとうございます。
guest

0

char date, month; ... while(fscanf(fp, "%[^,],%s,%s,%d,%d", tmpline, &date, &month, &num1, &num2) != EOF) {

書式 %s でcharを読み込む? そんなの誰に習った!?
...てか date/month はたった1文字でいいのか? charは1文字だぞ?

投稿2018/01/15 03:57

編集2018/01/15 03:59
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2018/01/15 04:23

ご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問