No.1ベストアンサー
- 回答日時:
こんにちは。
ご自身の勉強のために、あえてヒントだけを書きますと、
for
fgets
strtok
を使用すればできます。ヘルプを見て下さい。
strtokの使い方がポイントです。
これで分からなければ、再度投稿します。
この回答への補足
ありがとうございました。とりあえず、こうやってみました。でも無理でした。
int a[3][4];
char str[50];
FILE *fp;
if((fp=fopen("test","r"))==NULL)exit(0);
for(i=0;i<3;i++)
{
fgets(str,50,fp);
for (j=0;j<4;j++)
{
a[i][j]=atoi(strtok(str,","));
}
}
上の例で試したところ、配列aは以下のようになってしまいました。
1222,1222,1222,1222
2338,2338,2338,2338
534,534,534,534
strtokが、forループの中で毎回初めの数字を読み込んでいます。
No.6
- 回答日時:
既に解決なさってるようですが一応・・・
No.2の補足に対する回答です。
>こんなかんじでいいでしょうか?
いいと思いますよ。
>列が非常に長いときは、strtokを使うしかないのでしょうか?
あまり長いと、sscanfで指定するフォーマットが長くなってしまうので、
よくないですね。("%d,%d,%d,%d,・・・"という感じになってしまうので)
strtokの方がスマートに書けると思います。
(No.3の補足に書いてあるとおりです)
No.5
- 回答日時:
方法としては、No.4の回答でほとんど問題はないと思います。
実際にコードを書く場合には、ループの回数=配列の大きさを #define で定義して
使用すると、間違いが少なくなるでしょう。
また、fscanfではなく、fgetsとstrtokの組合せを勧めたのもミスを防ぎ、配列の
大きさに柔軟に対応させるためです。
たとえば、読み込むファイルをExcelで作成し、CSV形式で保存すれば、上の例に
あるファイルを作成できますが、行末にもカンマが付くことがあります。
例)
1222,2337,593,3488,
fscanfを使用すると、書き方によっては最後のカンマのために、2行目以降の
データが全てずれる可能性がありますが、No4の回答の例では、カンマがあっても
無くても正確に読み込めます。
どのようなフォーマットにしろ、テキスト(ascii)形式のファイルは、1行ずつ
fgetsで読み込んでから処理する事をお勧めします。
No.4
- 回答日時:
# No.3お礼より
こんな感じでどうでしょうか?
for (i = 0; i < 3; i++) {
a[i][0] = atoi( strtok( fgets(str,50,fp),"," ) );
for (j = 1; j < 4; j++)
a[i][j] = atoi( strtok( NULL,"," ) );
}
# 括弧の対応に要注意!
# データを間違えて読むことより、不正な配列アクセスをする方が危険なので、確実に3行4列を超えないようにループを組む必要があります。
↑非常に大事!
またfscanfループの1つの解として、こんなのもあります。が、、、
for (i = 0; i < 3*4; i++)
fscanf(fp, "%d,", *a + i);
これは必ずしも「よいプログラム」ではありません。
なぜなら「理解しにくい」からです(笑)
# 理解しやすいコーディングというのはとても大切なことなのですが、プロでもできてない人が大勢いるんです。
# こういうことをやる人に限って、自分のコードは素晴らしいと思ってる人が多くって・・・
# 素直なプログラムを書けるように頑張りましょう。
leaz愚痴モードでした。
No.3
- 回答日時:
# No.1の補足に対して
strtokは癖の強い関数なので、最初は悩みますよね。
この関数は内部に参照ポインタを持っていて、前回どこまで調べたかを覚えていてくれるのです。
2回目以降調べる場合は、第1引数にNULLを指定します。
最後まで調べ尽くすとNULLを返します。まぁ今回は数が分かっているので使いませんが。
以上を参考に改良をしてみてください。
# ただ、このような単純なフォーマットのテキストファイルならば、普通はfscanfのループで十分だと思いますが。
この回答への補足
fscanfの方法も分かりました。どうもありがとうございます。
単純なフォーマットならfscanfかsscanfが便利で、複雑なフォーマットや列が長い場合は、strtokを使えばいいことが分かりました。
ありがとうございます。
なるほど、下のように書けばうまくいきました。
for(i=0;i<3;i++)
{
fgets(str,50,fp);
j=0;
a[i][j]=atoi(strtok(str,","));
while(1)
{
j++;
if((a[i][j]=atoi(strtok(NULL,",")))==NULL)break;
}
}
この書き方でうまくいきますが、もっと効率のいい書き方ないでしょうか。
また、fscanfのループでうまくいくってのが分かりません。毎回先頭の数字を読み込みそうな気がしますが。
No.2
- 回答日時:
1列のデータは4つの数字がカンマで区切られたものですので、
sscanf
を用いればできると思います。
1列のデータを読み込んで、sscanfで数字を取り出して・・・。
と、ここまでにしておきます。
頑張って下さいね。
ありがとうございます。下のように書いたところ、うまくいきました。
こんなかんじでいいでしょうか。
列が非常に長いときは、strtokを使うしかないのでしょうか?
for(i=0;i<3;i++)
{
fgets(str,50,fp);
sscanf(str,"%d,%d,%d,%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- PDF PDFの出力時のファイル名を消したい 3 2022/09/05 01:16
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Ruby ruby 1 2022/06/10 13:31
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 入力と同時に桁数を詰める 3 2022/09/11 20:23
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
コンボボックスのインデックス...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
Excel2010のinputboxで複数デー...
-
C言語 ポインタと配列
-
VB6のメモリ解放に関して
-
Excelマクロ:配列データからグ...
-
.NET 文字コードの変換
-
Segmentation Fault (メモリ制限?)
-
エクセルVBAで実行時エラー7、...
-
複数のtextboxの処理を一括で行...
-
ReDim PreserveよりもReDimが遅い
-
Redim とEraseの違いは?
-
配列の初期化に時間がかかりま...
-
CheckBoxの配列化
-
COBOLの基本的な事なので...
-
C#でbyte配列から画像を表示さ...
-
EXCEL VBA 配列デー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
VBAで配列引数を値渡しできない...
-
C++で作成したDLLにVBAから配列...
-
構造体配列の特定のメンバーをF...
-
OutOfMemoryExceptionの回避策...
-
大量の変数を定義するにはどう...
-
VBAでMODE関数をつくる
-
VBScriptでCSVファイルを読み出...
-
定数配列の書き方
-
Segmentation Fault (メモリ制限?)
-
Excelのメモリ(配列)の上限は2G...
-
Redim とEraseの違いは?
-
CheckBoxの配列化
-
配列の中の最大値とそのインデ...
おすすめ情報