• 締切済み

C言語 文字列格納

テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> テキストファイルが1行区切りの文字列なら2次元配列で > if (fscanf(fp,"%s", &data[i][300]) == EOF) 2点ほど。 ・data[][]の型が書いてないので詳細は不明ですが これでは、data[i][300]に(または、data[i][300]から)データが入るのでは? ・%sで、というより、scanf系のほとんどの変換子で取り込めるのは、「1行区切り」だけではありません。 スペースもタブも改行も「空白文字」として同じ扱いになります。例外は[]くらい。 > テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 まずは「どのように格納するのが、後の処理を考えた場合に便利か」を御自身で考えてください。 行→列と分解した方がいい場合、行で格納して列の分解はしない方がいい場合、行も列も関係なく一列に格納した方がいい場合。 また、文字列のまま格納した方がいい場合、整数や実数等の数値に変換した方がいい場合。 扱うデータや後の処理によって最適な方法は違います。 決まったら、それをやるのに便利な方法を考え選択します。 例えば、行→列に分解なら ・fgetsで1行読み込み→strtokで分解 ・同→sscanfで個別に変換 ・同→自作関数「1文字目から見ていって空白が出ればそこで切って格納」 等があるし、とにかく行関係なく一列に格納するなら fscanfを連続で実行するだけです(上に書いたように、%sや%dは改行と空白の区別がありません)

ryukak
質問者

お礼

いろいろやりかたあるんですね! 是非とも参考にさせていただきます!

すると、全ての回答が全文表示されます。
回答No.2

空白文字が、(いわゆる半角)スペースやタブを意味しているのなら、プログラムは全く変更する必要はありません。 勝手に空白文字で区切ってくれます。 あと、 if (fscanf(fp,"%s", &data[i][300]) == EOF) は、 if (fscanf(fp,"%s", data[i]) == EOF) と書かれることが多いと思います。

ryukak
質問者

お礼

変更しなくてもできました! ありがとうございます! 全角の空白の場合のみ工夫がいるかんじですね!

すると、全ての回答が全文表示されます。
  • hrsmmhr
  • ベストアンサー率36% (173/477)
回答No.1

%d%d…%dと並べるか (引数の上限があるでしょうからどこかで破たんしますが、そもそも整数データ300個は空白で区切ってもキーボード入力できないと思います) gets();でストリングを読み込んで、空白を判定してdataに自身で格納するプログラミングをします

ryukak
質問者

お礼

ありがとうございます! 参考にさせていただきます!

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • DCP-J988Nの年賀状アプリで印刷を押しても白紙で出てきます。
  • お使いの環境はiOSで、接続は無線LANです。
  • 関連するソフト・アプリはブラザー年賀状アプリで、電話回線の種類はひかり回線です。
回答を見る

専門家に質問してみよう