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

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

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

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

Q&A

解決済

4回答

2606閲覧

ファイルを読み込むとは

ikuo-biyori

総合スコア56

C

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

0グッド

0クリップ

投稿2016/11/15 00:59

いつもお世話になっています。c言語初心者で、勉強中です。ファイルを読み込む課題が出たのですが、ファイルを読み込むというのがどういうことをしてるのか調べたのですが、よくわかりません。ファイルを開くのは分かるのですが、ファイルを読み込むのにscanfするじゃないですか。なぜscanfをしなければいけないのでしょうか。教えてください。

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

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

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

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

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

guest

回答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

A.Ichi

総合スコア4070

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

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

kurori

2016/11/15 05:12

ここが初心者さん向けのサイトかは分かりませんが、サンプルコードもあって分かりやすいと思いました。 >ファイルを読み込む課題が出たのですが、ファイルを読み込むというのがどういうことをしてるのか調べたのですが、 私が社内で新人に教えるときには、 ファイルの内容をプログラムで表示させたい場合などに、ファイルの内容を取得する行為を「読み込む」と表現したりします。 対して「ファイルを開く」というのはファイルに対してアクセスし、編集できる状態にする場合の表現として使うようにしています。 例えば、ファイルの中身を全く別の内容に書き換えたり、内容を消去したりする場合は 「ファイルを開く」事で編集できるようにする必要はあるが、ファイルの中のデータは必要ないので「ファイルを読み込む」必要はない、と社内では新人に教えてます。
ikuo-biyori

2016/11/15 10:24

具体的な例を加えて説明していただき、分かりやすかったです。お答えいただきありがとうございます。
guest

0

fscanfを使う必然はありません。私はscanf系はほとんど使いません。その代わり、readなどを使います。
バイナリーデータであればそのまま型に応じた変数や構造体に当て込めば良いのですが、テキスト文字列としてファイルに書かれている場合は、文字列の数値変換が必要になってきます。この場合は、一旦必要な分を読み出してから処理したほうがやりやすいと思います。

ファイルを開いて読み出しながら変換しても良いのですが、ファイルは必要以上長く開いておきたくない場合があるのと、処理の複雑さを減らす意味からファイルの読み出しと、読み出したデータの処理は分けることがよく行われます。

投稿2016/11/15 08:01

PineMatsu

総合スコア3579

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

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

0

scanf() について質問者さんが感じる「違和感」がちょっとよく分かりませんが・・・。

「読み込む」とは、ディスクのトラック/セクタで指定される位置の磁気データをデジタルに変換して、
メモリ上に置くことです。
オープンにより、目的のファイルがディスクのどのトラック、セクタから始まり、全部で何バイトあるのかが
分かります。その情報により、次々と移動しながら磁気データを読んでゆくのが「読み込み」です。

scanf()に関して言えば、通常アプリから操作できる一番基本的な「読み込み」はread() です。
fscanf()はもう少し簡単にデータを扱えるようにしたもので、read()で読み込んだデータを、フォーマットに
従って、自動に変換してくれるものです。
「変換」を自分でやるなら、scanf()を使う必要はありません。

投稿2016/11/15 02:22

nob.

総合スコア711

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

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

0

ベストアンサー

プログラムはファイルの中身を直接参照できません。
メモリ上にコピーしてそれを参照する必要があります。
そのための作業がfscanfになります。
fscanfはファイルの一部を変数にコピーしています。
またfscanf以外にもfgetsやfreadなどもありますので、用途に応じて使い分けましょう。

投稿2016/11/15 01:07

ttyp03

総合スコア16998

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

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

ikuo-biyori

2016/11/15 10:23 編集

メモリ上にコピーするために必要なことだったのですね、よく分かりました。お答えいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問