Linuxの「more」コマンドのようにファイル内容をページごとに表示するCプログラムの作成方法
この記事では、Linuxのmoreコマンドと同様に、ファイルの内容をページごとに表示するCプログラムの作成方法を解説します。
moreコマンドは、テキストファイルを一度にすべて表示するのではなく、画面に収まる範囲の行数だけを表示し、ユーザーの操作を待ってから続きを表示するページャーです。本プログラムでも同じように、まず指定した行数を画面に表示し、ユーザーがEnterキーを押すのを待ってから、次のページ(次のn行分)を表示していきます。
プログラムの仕組み
ファイルの内容をページごとに表示するため、プログラムは以下の手順で動作します。
fopen関数でファイルを読み込みモード("r")で開きます。fgetc関数でファイルを1文字ずつ読み込み、putcharで画面に出力します。- 改行文字(
'\n')を検出するたびに、行数カウンターを1ずつ増やします。 - カウンターがn行に達したら、
getcharでユーザーのキー入力を待ち、カウンターを0にリセットします。 - ファイルの終端(EOF)に達するまで、この処理を繰り返します。
サンプルコード
#include <stdio.h>
void displaytext(char *fname, int n) {
FILE *fp = fopen(fname, "r");
int lineCount = 0, ch;
if (fp == NULL) {
printf("No such file exists\n");
return;
}
while ((ch = fgetc(fp)) != EOF){
putchar(ch);
if (ch == '\n'){
lineCount++;
if (lineCount == n){
lineCount = 0;
getchar();
}
}
}
fclose(fp);
}
int main() {
char fname[] = "main.CPP";
int n = 10;
displaytext(fname, n);
return 0;
}
実行結果
指定したファイルが存在しない場合、プログラムはエラーメッセージを表示して終了します。
No such file exists
コードの解説
displaytext関数
displaytext関数は、ファイル名と1ページに表示する行数nを引数として受け取ります。まずfopenでファイルを開き、開けなかった場合(戻り値がNULLの場合)は「ファイルが存在しない」旨のメッセージを表示して処理を終了します。
ファイルが正常に開けた場合は、whileループ内でfgetcにより1文字ずつ読み込みます。読み込んだ文字が改行文字であればカウンターをインクリメントし、n行に達した時点でgetcharを呼び出してユーザーがEnterキーを押すまで待機します。これにより、moreコマンドのようなページ送りの動作が実現できます。
main関数
main関数では、表示したいファイル名と1ページあたりの行数(この例では10行)を指定してdisplaytext関数を呼び出しています。行数nの値を変更すれば、1ページに表示する行数を自由に調整できます。
まとめ
このように、標準入出力関数を組み合わせるだけで、Linuxのmoreコマンドに似たシンプルなページャー機能をC言語で実装できます。より実用的なページャーを作りたい場合は、スペースキーで次のページに進む、qキーで終了する、といったキー操作の判定を追加するとよいでしょう。
-
PythonでDataFrameから特定の列(1列または複数列)を削除する3つの方法
pandasのDataFrameを扱っていると、不要になった列を削除したい場面はよくあります。本記事では、PythonでDataFrameから1つの列、あるいは複数の列を削除するための3つの代表的な方法を、サンプルコード付きでわかりやすく解説します。前提:対象となるDataFrameまず、以下のようなDataFrameを例として使用します。 one two three 0 1 2 3 1 4 5 6このDataFrameに対して、「one」列を1つだけ削除すると、結果は
-
【Python入門】pandasで「K」で始まる都市名と州名を抽出してCSVファイルに保存する方法
はじめにデータ分析の現場では、特定の条件に合致する行だけを抽出して、別のファイルとして保存したいケースがよくあります。本記事では、pandasのDataFrameから「K」で始まる都市名(City)と州名(State)を持つ行を抽出し、その結果を新しいCSVファイルに出力するPythonプログラムを解説します。入力データのイメージここでは、City 列と State 列を持つ以下のようなDataFrameを想定します。この中から都市名・州名の両方が「K」で始まるデータだけを取り出し、別のCSVファイルに保存します。City,State Kochi,Kerala解決手順この問題は、以下の3つのス