「C言語/ファイル入出力」の版間の差分

削除された内容 追加された内容
typo
プロパティ lang=c を lang="C" に更新。
2 行
まず、ファイルを作成したり読み書きしたりするための関数を使うには、
 
<code><stdio.h></code>をインクルードしないといけない。
 
下記のような書式になる。
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
 
20 行
return 0;
}
</syntaxhighlight>
</source>
ファイルに読み書きなどの操作するためには、まず、そのファイルをオープン(開く)する必要がある。
 
46 行
その場合、使用を許可するために、下記のように<code>#pragma warning(disable:4996)</code>を下記のような位置に加える。
 
<sourcesyntaxhighlight lang=c"C">
// Windowsでfopenが使えない場合
 
66 行
return 0;
}
</syntaxhighlight>
</source>
 
<code>#pragma warning(disable:4996)</code> が、fopenなどの関数の使用許可の命令である。これは、stdafx など一連のWindows用ヘッダのインクルードの後で宣言する必要がある。
72 行
 
実際にWindows用のコードを書くと、下記のようになる。
<sourcesyntaxhighlight lang=c"C">
// Windows用のファイル操作のコード例
#include "stdafx.h"
96 行
return 0;
}
</syntaxhighlight>
</source>
 
 
121 行
ソースファイルのあるフォルダの場所は、Windowsの場合、標準設定では
 
:\ユーザー名\sourcesyntaxhighlight\repos\プロジェクト名\プロジェクト名
のアドレスのフォルダにある。
 
VisualStudio 2019 をインストールしたとき、既に sourcesyntaxhighlight というフォルダのある場合を除けば、普通は インストール時に sourcesyntaxhighlight という visual studio のプログラミング用のフォルダが自動作成されているので、そこのフォルダを探せばいい。
 
 
138 行
 
なお、windowsの設定では、ある設定の場合では <code>fopen</code> と同様に <code>fprintf</code> が初期状態では使えない場合があるので、
<sourcesyntaxhighlight lang=c"C">
#pragma warning(disable:4996)
</syntaxhighlight>
</source>
 
で宣言しておく必要の生じる場合もある。
146 行
 
インクルードすべきヘッダについては、標準出力のヘッダにあるので、
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
</syntaxhighlight>
</source>
でインクルードすれば充分である。
 
169 行
何か変数をファイルに書き込みたい場合、たとえば整数型の変数だとして、変数名が「hensuu」なら、それを書き込むには、あらかじめソースコードで
 
<sourcesyntaxhighlight lang=c"C">
int hensuu;
</syntaxhighlight>
</source>
 
のように、どこかで宣言しておく。
178 行
 
そのあと、プログラムがコード内でのファイル書き込み実行場所にて
<sourcesyntaxhighlight lang=c"C">
fprintf(fp1, "%d \n", hensuu);
</syntaxhighlight>
</source>
のようなコードを実行するように、ソースコードを記述すればいい。
 
192 行
 
;コード例
<sourcesyntaxhighlight lang=c"C">
#include "stdafx.h"
#include <stdio.h>
229 行
return 0;
}
</syntaxhighlight>
</source>
 
このようにして、ファイルへの出力が出来る。
267 行
 
コード例を示す。
<sourcesyntaxhighlight lang=c"C">
#include "stdafx.h"
#include <stdio.h>
305 行
return 0;
}
</syntaxhighlight>
</source>
 
 
325 行
 
2行目以降も読み取りたい場合には、その行数だけ、下記のように繰り返しfscanfを使う必要がある。
<sourcesyntaxhighlight lang=c"C">
 
#include "stdafx.h"
369 行
return 0;
}
</syntaxhighlight>
</source>
 
 
407 行
fgetsのほうは
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
446 行
}
 
</syntaxhighlight>
</source>
 
 
474 行
いっぽう、fscanf のほうは
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
514 行
}
 
</syntaxhighlight>
</source>
 
;実行結果
573 行
(Fedora30 で確認)
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
612 行
return 0;
}
</syntaxhighlight>
</source>
 
 
648 行
 
書式は
<sourcesyntaxhighlight lang=c"C">
strtok(分解する文字列のある変数,"区切り文字にしたい文字")
</syntaxhighlight>
</source>
のようになる。
 
CSVファイルを読み込ませたいなら、区切り文字にしたいのはカンマ記号なので、
<sourcesyntaxhighlight lang=c"C">
strtok(分解する文字列のある変数,",")
</syntaxhighlight>
</source>
となる。
 
なお、<code> strtok </code> の第一引数を「NULL」にすると、前の文字の続きから読み込む。つまり
<sourcesyntaxhighlight lang=c"C">
strtok(NULL,"区切り文字にしたい文字")
</syntaxhighlight>
</source>
にすると、前の文字の続きから次ぎの区切り文字まで(その行に残りの区切り文字がない場合には行末まで)を読み込む。
 
670 行
(Fedora30 で確認)
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
733 行
return 0;
}
</syntaxhighlight>
</source>
 
 
775 行
 
;コード例
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
839 行
return 0;
}
</syntaxhighlight>
</source>
 
 
901 行
 
;コード例(まだ改造してない)
<sourcesyntaxhighlight lang=c"C">
#include "stdafx.h"
#include <stdio.h>
940 行
return 0;
}
</syntaxhighlight>
</source>
 
 
949 行
 
;改造したコード例 (Visual Studio 2019 および Windows 7 で確認ずみ)
<sourcesyntaxhighlight lang=c"C">
#include "stdafx.h"
#include <stdio.h>
987 行
return 0;
}
</syntaxhighlight>
</source>
 
------------
995 行
このエラーの起きるコードでは、if文の条件節にファイルポインタを使ったif文の中で、むりやりクローズしようとしています。
 
<sourcesyntaxhighlight lang=c"C">
fp1 = fopen("test1.txt", "r");
if ((fp1 = fopen("test1.txt", "r")) == NULL) {
1,004 行
return 1;
}
</syntaxhighlight>
</source>
 
 
1,026 行
 
たとえば、次のコードは、読み取り対象のファイル"SettingFile.txt"の無い場合には、実行時にエラーになります
<sourcesyntaxhighlight lang=c"C">
// Linuxでエラーになる例
#include <stdio.h>
1,056 行
}
}
</syntaxhighlight>
</source>
 
 
1,062 行
 
(Fedora 31 で確認ずみ)
<sourcesyntaxhighlight lang=c"C">
// Linuxでエラーにならない例
#include <stdio.h>
1,092 行
}
}
</syntaxhighlight>
</source>
 
もし、読み取り対象のファイルの無い場合に、
1,122 行
Windowsなら、たとえば、次のようなコードで実装できます。
 
<sourcesyntaxhighlight lang=c"C">
FILE* fp1;
{
1,135 行
fclose(fp1);
}
</syntaxhighlight>
</source>
 
ここで重要なのは、 <code> fopen </code> で開いた回数は、上記のコードでは2箇所あるのに(if文の条件の記述での <code> fopen </code> は除く)、実際に開かれるファイル名は1個(例の場合ならテキストファイル "SettingFile.txt" の1個だけ)であるという事です。
1,159 行
 
;コード (Fedora 31 で確認ずみ)
<sourcesyntaxhighlight lang=c"C">
// Linux用
#include <stdio.h>
1,189 行
}
}
</syntaxhighlight>
</source>
 
 
1,246 行
;コード例 (Fedora30 で確認ずみ)
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
1,304 行
return 0;
}
</syntaxhighlight>
</source>
 
実行結果
1,381 行
テキストファイルの文字コードはUTF-8である。Fedoraの標準の文字コードのままである。テキストエディタにはGedit(ジーエディット)を用いている。GeditはFedora28で標準に付属してくるテキストエディタである。
 
<sourcesyntaxhighlight lang=c"C">
#include <stdio.h>
 
1,417 行
return 0;
}
</syntaxhighlight>
</source>
 
 
1,456 行
 
;Linuxの場合のコード例
<sourcesyntaxhighlight lang=c"C">#include <stdio.h>
#include <locale.h>
#include <wchar.h>
1,491 行
return 0;
}
</syntaxhighlight>
</source>
 
 
1,527 行
例えば、下記のようなコードを書いても、日本語の文字は、文字化けしてしまう。
 
<sourcesyntaxhighlight lang=c"C">
// 文字化けしてしまう。
// Windowsを想定
1,573 行
}
 
</syntaxhighlight>
</source>