更新:2024/09/02
Octaveのテキストファイルの書き込み・読み込み・練習問題について


ふゅか
今日はテキストファイルの読み書きについて話すんだけど、やったことある?

はるか
うん、少しだけ。書き込むのは簡単。fopenでファイルを開いて、fprintfで書く、最後にfcloseで閉じるだけ。
目次
1. テキストファイルの書き込み
テキストファイルにデータを書き込むには、以下の手順を踏みます。
- ファイルを開く:
fopen
関数を使って、書き込みモード(”w”)でファイルを開きます。 - データを書き込む:
fprintf
関数を使ってデータをファイルに書き込みます。 - ファイルを閉じる:
fclose
関数を使ってファイルを閉じます。
% 書き込み用のファイルを開く
fid = fopen('example.txt', 'w');
% データを書き込む
fprintf(fid, 'Octaveでテキストファイルに書き込みを行います。\n');
fprintf(fid, '数値データも書き込めます: %d\n', 42);
% ファイルを閉じる
fclose(fid);
開いているディレクトリにexample.txtが生成されて次のようになります。

はるか
次はファイルの読み込みね。fopenで開いて、fgetlで一行ずつ読む。

ふゅか
fgetlだと改行なしで読み込むんだよね。fgetsだと改行を含めて読み込めるから、使い分けが大事だね!
2. テキストファイルの読み込み
テキストファイルからデータを読み込むには、以下の手順を踏みます。
- ファイルを開く:
fopen
関数を使って、読み込みモード(”r”)でファイルを開きます。 - データを読み込む:
fgetl
やfscanf
、fgets
関数を使ってデータを読み込みます。 - ファイルを閉じる:
fclose
関数を使ってファイルを閉じます。
% 読み込み用のファイルを開く
fid = fopen('example.txt', 'r');
% 1行ずつ読み込んで表示
while ~feof(fid)
line = fgetl(fid);
disp(line);
end
% ファイルを閉じる
fclose(fid);
2.1. fgetl 関数
fgetl
は、ファイルから1行ずつ読み込むための関数です。この関数は、改行文字を除いた行を文字列として返します。
fid = fopen('example.txt', 'r');
line = fgetl(fid);
disp(strcat("1行目:","",line)); % 改行なしで1行を表示
line = fgetl(fid); % 次の行を表示
disp(strcat("2行目:","",line)); % 改行なしで1行を表示
fclose(fid);
ファイルから1行ずつ読み込みたい場合、改行文字を含めずに取得したい場合に使用します。
2.2. fgets 関数
fgets
もファイルから1行ずつ読み込みますが、fgetl
とは異なり、改行文字を含んで読み込みます。
fid = fopen('example.txt', 'r');
line = fgets(fid);
disp(strcat("1行目:","",line)); % 改行なしで1行を表示
line = fgets(fid); % 次の行を表示
disp(strcat("2行目:","",line)); % 改行なしで1行を表示
fclose(fid);
ファイルから1行ずつ読み込みたい場合、改行文字を含めて取得したい場合に使用します。
2.3. 関数のまとめ
fgetl
: ファイルから1行を改行文字なしで読み込む。fgets
: ファイルから1行を改行文字込みで読み込む。
3. 練習問題
3.1. 練習問題 1: ファイルへの書き込み
次のデータをテキストファイルに書き込んでください。
- 学生の名前と点数の対応(名前: “fuxyuka”, “haruka”, “Chmod”、点数: 100, 81, 74)。
- 各行に「名前: 点数」という形式で書き込んでください。
手順:
- ファイル名を
students.txt
とします。 - ファイルを
w
モードで開き、データを書き込みます。 - ファイルを閉じます。
期待される出力: students.txt
ファイルの内容は次のようになります。
fxyuka: 100
haruka: 81
Chmod: 74
解答:
% 学生の名前と点数を students.txt に書き込む
fid = fopen('students.txt', 'w');
fprintf(fid, 'fxyuka: 100\n');
fprintf(fid, 'haruka: 81\n');
fprintf(fid, 'Chmod: 74\n');
fclose(fid);
3.2. 練習問題 2: ファイルからの読み込み
練習問題1で作成した
students.txt
ファイルを読み込み、各学生の名前と点数を表示してください。手順:
- ファイルを
r
モードで開きます。 - ファイルを1行ずつ読み込み、読み込んだ行をそのまま表示します。
- ファイルを閉じます。
期待される出力: 以下のように各行が表示されます。
fxyuka: 100
haruka: 81
Chmod: 74
解答:
% students.txt ファイルを読み込み、内容を表示
fid = fopen('students.txt', 'r');
while ~feof(fid)
line = fgetl(fid); % 1行ずつ読み込み
disp(line); % 読み込んだ行を表示
end
fclose(fid);

ふゅか
簡単そうだけど、whileループで最後まで読み込むことを忘れないようにね!

はるか
feof関数でファイルの終わりを確認しながら進めるといい。
3.3. 練習問題 3: 数値データの読み込み
次のテキストファイルを作成し、数値データのみを読み込んで合計を計算してください。
ファイル内容 (ファイル名: numbers.txt
):
10
20
101
40
50
手順:
numbers.txt
ファイルをr
モードで開きます。fscanf
関数を使って、数値データを読み込みます。- 読み込んだデータの合計を計算し、表示します。
- ファイルを閉じます。
期待される出力:
合計: 150
解答:
% numbers.txt に数値データを書き込み(この手順は省略可能)
fid = fopen('numbers.txt', 'w');
fprintf(fid, '%d\n', 10);
fprintf(fid, '%d\n', 20);
fprintf(fid, '%d\n', 101);
fprintf(fid, '%d\n', 40);
fprintf(fid, '%d\n', 50);
fclose(fid);
% numbers.txt ファイルから数値を読み込み、合計を計算して表示
fid = fopen('numbers.txt', 'r');
data = fscanf(fid, '%d');
fclose(fid);
sum_data = sum(data);
fprintf('合計: %d\n', sum_data);