Posted at

C言語でテキストファイルを読み込みたい時

More than 3 years have passed since last update.

C言語でテキストファイル読み込みたい!と思っててきとうに書いたらエラージゴックになってようやくエラーなくなったのでまとめときます。

備忘録備忘録だいじね。


C言語でのコマンドライン引数の取り方

#include <stdio.h>

#include <stdlib.h> //exitを定義?

int main(int argc, char *argv[]) {
// int argcは引数の個数 char *argv[]は引数の文字列を指すポインタ型配列
// printf("引数の個数は%d個です。\n", argc-1);
// こんな感じで引数の個数わかります
//printf("%s\n", argv[1]);
//これでファイル名が拾えます

FILE *file;
char buffer[1000];

if(argc!=2){
printf("コマンドの後に1つファイルを指定してください。\n");
printf("使用法: ./output_file <ファイル名>\n");
exit(1);
}

if ((file = fopen(argv[1], "r"))==NULL) {
printf("ファイルを開くのに失敗しました\n");
exit(1);
}
printf("--------\n");
while((fgets(buffer, 100, file))!=NULL) {
printf("%s", buffer);
}
printf("\n");

fclose(file);

return 0;
}

C言語はやっぱレガシー感やばいですね。

ファイルの中身とってくるのに資料調べながら1時間くらいかかってしまいました...w

argv[0]にそもそも実行コマンド名が入ってきてうおおっっ!!てなってしまったんですが、自分だけですか?普通配列一番目は対称引数の1番目じゃないんですか!?と...

FILE型はサイズや位置などの様々な情報が入った構造体です。構造体は変数の集まりみたいなものですね。

fopen()で開く事によって、構造体へのポインタを返してくれます。なので上記のファイルではFILE型ポインタ変数?(合ってるのか?)に代入して取り扱ってます。

なのでアドレスとかは再代入で変えないようにしましょうね!

C言語ではファイルを開いた状態(ストリームといいます)にしてから、その中の情報にアクセスします。

fgets()関数は文字列1列ずつを文字列ポインタとして返してくれます。

この関数ですが、文字列をブチ込むポインタ、格納する文字列のバイト数(たぶん)、ストリームポインタの3つを引数に取る関数なのでまたこれが使いにくいです。

image

fgets関数に関しては参照に貼ったリンク先で詳細が説明されています。

テキストファイル読み込んだ結果、成功です。

かしこまっ!

image

ポインタにやっと慣れ親しめてきたかな?もっとガシガシ書いて体にしみ込ませよう :persevere:

そういやmain関数以外ではコマンドライン引数取って来れないのかな??


参照

http://simd.jugem.jp/?eid=47