LoginSignup
9
8

More than 5 years have passed since last update.

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

Posted at

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関数以外ではコマンドライン引数取って来れないのかな??

参照

9
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8