Cでのファイル処理—ファイルを開く、閉じる、書き込む方法

helloworld以前にCプログラムを作成したことがある場合は、Cでの基本的なファイルI / Oをすでに知っています。

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

ファイル処理は、プログラミングの最も重要な部分の1つです。Cでは、ファイルタイプの構造体ポインタを使用してファイルを宣言します。

FILE *fp;

Cは、基本的なファイル操作を実行するためのいくつかの組み込み関数を提供します。

  • fopen() -新しいファイルを作成するか、既存のファイルを開きます
  • fclose() -ファイルを閉じる
  • getc() -ファイルから文字を読み取ります
  • putc() -ファイルに文字を書き込みます
  • fscanf() -ファイルからデータセットを読み取ります
  • fprintf() -一連のデータをファイルに書き込みます
  • getw() -ファイルから整数を読み取ります
  • putw() -整数をファイルに書き込みます
  • fseek() -位置を希望点に設定します
  • ftell() -ファイル内の現在の位置を示します
  • rewind() -位置を始点に設定します

ファイルを開く

このfopen()関数は、ファイルを作成したり、既存のファイルを開いたりするために使用されます。

fp = fopen(const char filename,const char mode);

ファイルを開くには多くのモードがあります。

  • r -読み取りモードでファイルを開く
  • w -書き込みモードでテキストファイルを開くか作成します
  • a -ファイルを追加モードで開きます
  • r+ -読み取りモードと書き込みモードの両方でファイルを開きます
  • a+ -読み取りモードと書き込みモードの両方でファイルを開きます
  • w+ -読み取りモードと書き込みモードの両方でファイルを開きます

ファイルからデータを読み取って書き込む例を次に示します。

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

「これはテキストを画面に出力するだけです。このファイルのIOはどうですか?」と考えているかもしれません。

答えは最初は明白ではなく、UNIXシステムについてある程度理解する必要があります。UNIXシステムでは、すべてがファイルとして扱われます。つまり、ファイルからの読み取りとファイルへの書き込みが可能です。

これは、プリンターで行うのはプリンターでの書き込みだけなので、プリンターをファイルとして抽象化できることを意味します。これらのファイルをストリームと考えることも役立ちます。後で説明するように、シェルを使用してファイルをリダイレクトできるためです。

では、これはhelloworldIOとどのように関連してファイルするのでしょうか。

を呼び出すとprintf、実際にはstdout標準出力の略である、という特別なファイルに書き込んでいますstdoutシェル(通常は端末)によって決定された標準出力を表します。これは、それが画面に印刷された理由を説明しています。

そこ努力であなたに利用可能な他の二つの流れ(すなわちファイル)があり、stdinそしてstderr。シェルが通常キーボードに接続する標準入力をstdin表します。表す標準エラーあなたのシェルは通常の端末に接続する出力を、。stderr

初歩的なファイルIO、またはパイプを敷設する方法を学びました

十分な理論ですが、コードを書いてビジネスに取り掛かりましょう。ファイルに書き込む最も簡単な方法は、出力リダイレクトツールを使用して出力ストリームをリダイレクトすることです>

追加したい場合は、以下を使用できます>>

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

hello.txt意志の内容は、当然のことながら、

Hello, world!

我々はと呼ばれる別のプログラムがあるだろうgreetに類似し、helloworld与えられたとの挨拶ができていること、name

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

キーボードから読み取る代わりにstdin<ツールを使用してファイルから読み取るようにリダイレクトできます。

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

注:これらのリダイレクト演算子は、bash同様のシェルにあります。

本物

上記の方法は、最も基本的なケースでのみ機能しました。より大きく、より良いことをしたい場合は、シェルを介してではなく、C内からファイルを操作することをお勧めします。

To accomplish this, you will use a function called fopen. This function takes two string parameters, the first being the file name and the second being the mode.

The mode are basically permissions, so r for read, w for write, a for append. You can also combine them, so rw would mean you could read and write to the file. There are more modes, but these are the most commonly used.

After you have a FILE pointer, you can use basically the same IO commands you would’ve used, except that you have to prefix them with f and the first argument will be the file pointer. For example, printf’s file version is fprintf.

Here’s a program called greetings that reads a from a file containing a list of names and write the greetings to another file:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

Suppose names.txt contains the following:

Kamala Logan Carol

Then after running greetings the file greet.txt will contain:

Hello, Kamala! Hello, Logan! Hello, Carol!