PR
更新:2024/09/02

Octaveのテキストファイルの書き込み・読み込み・練習問題について

ふゅか
ふゅか
今日はテキストファイルの読み書きについて話すんだけど、やったことある?
はるか
はるか
うん、少しだけ。書き込むのは簡単。fopenでファイルを開いて、fprintfで書く、最後にfcloseで閉じるだけ。

1. テキストファイルの書き込み

テキストファイルにデータを書き込むには、以下の手順を踏みます。

  1. ファイルを開く: fopen関数を使って、書き込みモード(”w”)でファイルを開きます。
  2. データを書き込む: fprintf関数を使ってデータをファイルに書き込みます。
  3. ファイルを閉じる: fclose関数を使ってファイルを閉じます。
% 書き込み用のファイルを開く
fid = fopen('example.txt', 'w');

% データを書き込む
fprintf(fid, 'Octaveでテキストファイルに書き込みを行います。\n');
fprintf(fid, '数値データも書き込めます: %d\n', 42);

% ファイルを閉じる
fclose(fid);

開いているディレクトリにexample.txtが生成されて次のようになります。

はるか
はるか
次はファイルの読み込みね。fopenで開いて、fgetlで一行ずつ読む。
ふゅか
ふゅか
fgetlだと改行なしで読み込むんだよね。fgetsだと改行を含めて読み込めるから、使い分けが大事だね!

2. テキストファイルの読み込み

テキストファイルからデータを読み込むには、以下の手順を踏みます。

  1. ファイルを開く: fopen関数を使って、読み込みモード(”r”)でファイルを開きます。
  2. データを読み込む: fgetlfscanffgets関数を使ってデータを読み込みます。
  3. ファイルを閉じる: 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)。
  • 各行に「名前: 点数」という形式で書き込んでください。

手順:
  1. ファイル名を students.txt とします。
  2. ファイルを w モードで開き、データを書き込みます。
  3. ファイルを閉じます。

期待される出力: 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 ファイルを読み込み、各学生の名前と点数を表示してください。

手順:

  1. ファイルを r モードで開きます。
  2. ファイルを1行ずつ読み込み、読み込んだ行をそのまま表示します。
  3. ファイルを閉じます。

期待される出力: 以下のように各行が表示されます。

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

手順:

  1. numbers.txt ファイルを r モードで開きます。
  2. fscanf 関数を使って、数値データを読み込みます。
  3. 読み込んだデータの合計を計算し、表示します。
  4. ファイルを閉じます。

期待される出力:

合計: 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);