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

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

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

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

Q&A

解決済

2回答

4911閲覧

C言語でNULLデータが含まれているファイルを読み込み、各要素を取り出すコードのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2018/01/15 04:59

編集2018/01/15 05:00

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

実現したいこと

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

###エラー
各要素にNULLがないtrial.txtの場合はコードが実行されて、実現したい解が求められるのですが、trial2.txtのようにデータにNULLが含まれているとエラーのように同じものが永遠に表示されます。
trial.txt

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

trial2.txt(NULLデータを含む)

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

エラー

2018/01/15,Jan,3,100 2018/01/15,Jan,3,100 2018/01/15,Jan,3,100 ・ ・ ・

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

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}

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

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

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

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

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

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

guest

回答2

0

scanfは普段使わないのですが、調べてみた感じだとscanfだけでCSVを分解するのは難しそうです。
素直にfgets等で行読み込みして、strtokで処理したほうが無難かと思います。

strtokだと連続カンマは対処できないみたいです。すみません。
まじめに分解する処理を作ってください。
簡単にできそうなのが見つかればまた投稿します。

投稿2018/01/15 05:17

編集2018/01/15 06:19
ttyp03

総合スコア16998

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

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

退会済みユーザー

退会済みユーザー

2018/01/15 06:41

ご回答いただきましてありがとうございます。この状況を踏まえ、データの必ずある列のみを取得し出力する実装にしたいと思います。
guest

0

ベストアンサー

scanfのフォーマットこねくり回すより
strtok/strtok_s使ってカンマ区切りで分割した方が楽じゃねぇすか?

...ダメだ、カンマの連続はstrtokでスキップされる。
今後データに','や'"'を含む場合に対処することになりそうなら、マヂメにCSV-parser実装するが吉かと。

投稿2018/01/15 05:15

編集2018/01/15 06:03
episteme

総合スコア16614

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

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

ttyp03

2018/01/15 06:17

strtok、連続カンマはスキップされてしまうんですね! 知らなかった・・・。 strtok使ったほうが良いと回答してしまいましたw 意外と使えないですね、strtok。
episteme

2018/01/15 06:21

へぃ、そうでないと区切り文字をspaceとしたときspaceの連続を読み飛ばしてくれないことになっちゃうので。 マヂ実装するなら"次にカンマの現れる位置"を調べ、カンマ間に挟まれた文字列を抽出することになるかと。
退会済みユーザー

退会済みユーザー

2018/01/15 06:41

ご回答いただきましてありがとうございます。この状況を踏まえ、データの必ずある列のみを取得し出力する実装にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問