いつもお世話になっています。c言語初心者で、勉強中です。ファイルを読み込む課題が出たのですが、ファイルを読み込むというのがどういうことをしてるのか調べたのですが、よくわかりません。ファイルを開くのは分かるのですが、ファイルを読み込むのにscanfするじゃないですか。なぜscanfをしなければいけないのでしょうか。教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
サンプルプログラムを見ながらのご説明
プログラムの流れ
(1)ファイルをオープンします。
(2)ファイルを読込みます。
(3)ファイルをクローズします。
(1)ではファイルをオープンした状態(ファイルの場所を見つけて開けるかを確認)ですので、
次の(2)データ取り出し(読込み)を行います。今回は、fscanfで一行読込み&表示を最終行まで繰り返します。
(3)でフィアルをクローズします。
/tmp/test.txtファイルは以下の様になっていてこれをプログラムで読込み表示します。
ABC 456
DEF 789
c
1#include <stdio.h> 2main() { 3 4 FILE * fp; //ファイルの構造体のポインタ変数の宣言 5 int ret; //戻り値(return)を入れる為の整数変数 6 char getstr[4]; //4個の文字列を入れるエリア(配列) 7 int getint; //整数を保存するための変数 8 /*(1)ファイルオープン */ 9 fp = fopen( "/tmp/test.txt" , "r" ); // /tmpディレクトリのファイルを「読込のみ」でオープンする。 10 if( fp == NULL ) { // fpがnullの場合エラー 11 printf( "ファイルオープンエラー\n" ); 12 return -1; 13 } 14 15 /*(2) ファイルから一行づつ読込み各変数に変換して代入して表示 */ 16 while(( ret = fscanf( fp , "%s%d" , getstr , &getint )) != EOF ) { 17 //一行づつEOF(End Of File)になるまで読み込む 18 //fscanfはブランクで区切られているデータを%sで文字列としてgetstrに格納し 19 //%dで整数としてgetintに格納(アドレス指定なので&を付ける) 20 //retには代入した個数が入ります 21 22 /* 変換して代入された変数を表示 */ 23 printf( "getstr=%s\n" , getstr ); //文字列を表示 24 printf( "getint=%d\n" , getint ); //整数を表示 25 printf( "ret=%d\n" , ret ); //代入した個数を返す 26 } 27 /* (3)ファイルクローズ */ 28 fclose( fp ); 29 return 0; 30}
<実行結果>
getstr=ABC
getint=456
ret=2
getstr=DEF
getint=789
ret=2
while
1while(( ret = fscanf( fp , "%s%d" , getstr , &getint )) != EOF ) {...} 2 3このwhileループ{...}では、test.txtは2行しか有りませんが、プログラムは3回読込みを行います。 4但し3回目は、fscanfからの戻り値は個数でなく-1(マイナス)がretに入ります。これがEOFとなり 5whileループ内を実行する前に抜けます。(ファイルのEOFを読み込むとも言われます) 6※getstrに&が有りませんが、付ける場合は、&getstr[0]としてください。
投稿2016/11/15 02:56
総合スコア4070
0
fscanfを使う必然はありません。私はscanf系はほとんど使いません。その代わり、readなどを使います。
バイナリーデータであればそのまま型に応じた変数や構造体に当て込めば良いのですが、テキスト文字列としてファイルに書かれている場合は、文字列の数値変換が必要になってきます。この場合は、一旦必要な分を読み出してから処理したほうがやりやすいと思います。
ファイルを開いて読み出しながら変換しても良いのですが、ファイルは必要以上長く開いておきたくない場合があるのと、処理の複雑さを減らす意味からファイルの読み出しと、読み出したデータの処理は分けることがよく行われます。
投稿2016/11/15 08:01
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
scanf() について質問者さんが感じる「違和感」がちょっとよく分かりませんが・・・。
「読み込む」とは、ディスクのトラック/セクタで指定される位置の磁気データをデジタルに変換して、
メモリ上に置くことです。
オープンにより、目的のファイルがディスクのどのトラック、セクタから始まり、全部で何バイトあるのかが
分かります。その情報により、次々と移動しながら磁気データを読んでゆくのが「読み込み」です。
scanf()に関して言えば、通常アプリから操作できる一番基本的な「読み込み」はread() です。
fscanf()はもう少し簡単にデータを扱えるようにしたもので、read()で読み込んだデータを、フォーマットに
従って、自動に変換してくれるものです。
「変換」を自分でやるなら、scanf()を使う必要はありません。
投稿2016/11/15 02:22
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/15 05:12
2016/11/15 10:24