【C言語/C++】fgetsを使ってファイルを読み込む

公開日: : 最終更新日:2014/08/14 C/C++

スポンサーリンク

fgetsで単純にファイルを読み取る

C言語、C++でfgetsを使ってファイルを読み込む方法です。
fgets関数では文字をcharの配列でファイルストリームから1行ずつ読み取ることができます。
返り値としてファイルの終わりまで読み込みが完了した時点でNULLが返ってくるのでよくwhileを使って以下のように書かれることが多いです。(たぶん)

単純なサンプル

#include<stdio.h>
#define MAX 2048
int main(void){
	FILE *fp ;
	char buf[MAX]={0};
	if((fp=fopen("test.txt","r"))!=NULL){
		/*ファイルの終わりまで繰り返し読み込む*/
		while( fgets(buf,MAX,fp) != NULL ){
			printf("%s",buf);
		}
	}
	return 0;
}
test.txt
abcdefg
あいうえお
123456
abcdefg
あいうえお
123456

fgetsの始めの引数は読み取った文字列を格納するchar配列、2つ目は読み取りの最大バイト数、3つ目がファイルポインタです。
ソースのMAXの定義は2の累乗で適当な大きな値を取りました。このサンプルはファイル(test.txt)からfgetsを使ってファイルを1行読み取り、そのままprintfで出力しています。

CSVファイルの読み取り

上では単純に文字を読み込んで吐き出すだけでしたが、実際では読み込んだのちに文字列をカンマで分割して、数値に変換するといった処理が必要になる場合があると思います。以下に単純なカンマ区切りのCSVファイルを読み込むサンプルを作成しました。

文字の分割にはstring.hのstrtok関数を、文字列から数値への変換はstdlib.hのatof関数を利用しています。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 2048
int main(void){
	FILE *fp ;
	char buf[MAX]={0};
	char *ary[3] ;
	double data[3]={0};
	if((fp=fopen("test.csv","r"))!=NULL){
		/*ファイルの終わりまで繰り返し読み込む*/
		while( fgets(buf,MAX,fp) != NULL ){
			/*文字列(char配列)をカンマで分割する*/
			ary[0] = strtok(buf,",");
			ary[1] = strtok(NULL,",");
			ary[2] = strtok(NULL,",");
			/*文字列(char配列)をdoubleに変換する*/
			data[0] = atof(ary[0]);
			data[1] = atof(ary[1]);
			data[2] = atof(ary[2]);
			printf("文字⇒%s : %s : %s",ary[0],ary[1],ary[2]);
			printf("数値⇒%.2f : %.2f : %.2f\n",data[0],data[1],data[2]);
			printf("----------------\n");
		}
	}
	return 0;
}
test.csv
1,2,3
1.2,5.6,3.0
-5.9,2.7,-1.0
文字⇒1 : 2 : 3
数値⇒1.00 : 2.00 : 3.00
----------------
文字⇒1.2 : 5.6 : 3.0
数値⇒1.20 : 5.60 : 3.00
----------------
文字⇒-5.9 : 2.7 : -1.0
数値⇒-5.90 : 2.70 : -1

無事にカンマで分割して、数値に変換することができました。
ただ、strtok関数は少し使い勝手がよくわからない関数なので注意が必要です。
また、数値の変換においてint型の場合では『atoi』関数を同じような要領で使うと変換することができますが、いずれの関数も数値に相当しない文字列が入っていた場合のエラー回避がないようなので気を付けて使う必要があります。
この問題を回避したい場合は戻り値がdoubleのstrtod関数を使用したほうがいいです。

最後に、CSVなどのファイルの読み込みに関しては別の方法もあります。ファイルの読み込みに関して過去に書いた記事もあるのでそちらも参考にしてみてください。

C: Control - The Money & Soul of Possibility [Blu-ray] [Import]

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

PAK23_husentomemo20140313500-thumb-500xauto-4376

【C言語】printfのような関数を作る

C言語でよくつかわれるprintfでは例えば int a,b,c; … printf(

記事を読む

0f2890d83857f2d3e50d317c4ef807c2_s

【C言語】fscanfでファイルを1行ずつ読み込む

C言語のfscanfでCSV形式(単純なカンマ区切り)のファイルを読み込むサンプル。 基本的なこと

記事を読む

フォルダ画像

【C言語/C++】フォルダ作成を行う

C言語、C++でフォルダを作成するには『direct.h』にある『_mkdir』関数を使うことで実現

記事を読む

Window Command Line

コンソールアプリケーションでC++/CLIの関数を使う

今時(?)なかなか使っている人がいるかどうかわかりませんが、VisualStudio(2008)で「

記事を読む

CSSS85_MBAwonozokujyosei20131019500-thumb-500xauto-4044

【C++】vectorの解放

C++STLにあるvectorは配列の要素数がわからない場合などに非常に便利ですがメモリ関係で面倒だ

記事を読む

PAK86_codeing20140517500-thumb-500xauto-4601

【C言語/C++】配列のまとめ

C/C++を使っていると必ず配列を使う場面が出てくると思いますが、その配列についてまとめました。C言

記事を読む

darts-102919_640

【C++】多次元ベクトルクラスを作る

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありま

記事を読む

PAK86_codeing20140517500-thumb-500xauto-4601

【C++/CLI】フォームアプリケーションでコンソール画面を出現させる

プロジェクトのプロパティを開いて「構成プロパティ」→「リンカ」→「システム」の「サブシステム」を「コ

記事を読む

0533f0e24573da8dbd68f5c6e7d452d7_s

【C++】ファイルの読み込みまとめ

C++におけるファイル読み込みのまとめ ファイルの開き方 値の取得方法 >>演算子

記事を読む

question

【C言語/C++】はてなの演算子の三項演算子について

C言語などのサンプルにたまに出てくるはてな(?)の演算子は 『?』と『:』の2つで1つの演算子であ

記事を読む

encodingtype
【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

_rtm0919_tp_v
スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

rssimage
【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

rssimage
フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

computer_server
格安プラン限定レンタルサーバー機能比較表(2016年)

はじめに  最近新しい共用サーバーをレンタルしようと思い調査およびそ

school_toshokan_hondana
kindle unlimitedが便利だったのでお勧めの使い方など感想メモ

 kindle unlimitedというサービスが8/3からAmazo

TAKEBE055122558_TP_V
寝る前にスマホを見ると斜視になる可能性とその対策

はじめに  寝る前などスマホを横になりながら見続けると斜視になる可能

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑