C言語でファイルから指定した行を削除するプログラムの書き方
ファイルとはディスク上の物理的な保存場所であり、ディレクトリはファイルを整理するための論理的なパスです。ファイルは必ず何らかのディレクトリの中に存在します。
ファイルに対して実行できる基本的な操作は、主に次の3つです。
- ファイルを開く
- ファイルを処理する(読み込み・書き込み・編集)
- ファイルを保存して閉じる
アルゴリズム
C言語でファイルから指定した行を削除するプログラムの手順を、以下のアルゴリズムで説明します。
ステップ1:実行時に、対象ファイルのパスと削除したい行番号を読み込みます。
ステップ2:元のファイルを読み込みモードで開き、ソースファイルとして扱います。
ステップ3:一時ファイルを作成して書き込みモードで開き、その参照を一時ファイルポインタに格納します。
ステップ4:行番号を追跡するためのカウンタ変数 count を 1 で初期化します。
ステップ5:ソースファイルから1行読み込み、バッファに格納します。
ステップ6:現在の行が削除対象の行と異なる場合(line != count)、バッファの内容を一時ファイルに書き込みます。
ステップ7:カウンタをインクリメントします(count++)。
ステップ8:ソースファイルの終端に達するまで、ステップ5〜7を繰り返します。
ステップ9:ソースファイルと一時ファイルの両方を閉じます。
ステップ10:元のソースファイルを削除します。
ステップ11:一時ファイルをソースファイルのパス名にリネームします。
サンプルプログラム
以下は、ファイルから指定した行を削除するC言語プログラムです。
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 1000
void deleteLine(FILE *src, FILE *temp, const int line);
void printFile(FILE *fptr);
int main(){
FILE *src;
FILE *temp;
char ch;
char path[100];
int line;
src=fopen("cprogramming.txt","w");
printf("enter the text.press cntrl Z:\n");
while((ch = getchar())!=EOF){
putc(ch,src);
}
fclose(src);
printf("Enter file path: ");
scanf("%s", path);
printf("Enter line number to remove: ");
scanf("%d", &line);
src = fopen(path, "r");
temp = fopen("delete.tmp", "w");
if (src == NULL || temp == NULL){
printf("Unable to open file.\n");
exit(EXIT_FAILURE);
}
printf("\nFile contents before removing line.\n\n");
printFile(src);
// Move src file pointer to beginning
rewind(src);
// Delete given line from file.
deleteLine(src, temp, line);
/* Close all open files */
fclose(src);
fclose(temp);
/* Delete src file and rename temp file as src */
remove(path);
rename("delete.tmp", path);
printf("\n\n\nFile contents after removing %d line.\n\n", line);
// Open source file and print its contents
src = fopen(path, "r");
printFile(src);
fclose(src);
return 0;
}
void printFile(FILE *fptr){
char ch;
while((ch = fgetc(fptr)) != EOF)
putchar(ch);
}
void deleteLine(FILE *src, FILE *temp, const int line){
char buffer[BUFFER_SIZE];
int count = 1;
while ((fgets(buffer, BUFFER_SIZE, src)) != NULL){
if (line != count)
fputs(buffer, temp);
count++;
}
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
enter the text.press cntrl Z: Hi welcome to my world This is C programming tutorial You want to learn C programming Subscribe the course in TutorialsPoint ^Z Enter file path: cprogramming.txt Enter line number to remove: 2 File contents before removing line. Hi welcome to my world This is C programming tutorial You want to learn C programming Subscribe the course in TutorialsPoint File contents after removing 2 line. Hi welcome to my world You want to learn C programming Subscribe the course in TutorialsPoint
プログラムのポイント
このプログラムでは、fgets関数を使って1行ずつ読み込み、削除対象の行番号以外の行だけを一時ファイルにコピーしています。処理完了後、元のファイルをremove関数で削除し、rename関数で一時ファイルを元のファイル名に変更することで、実質的に「行の削除」を実現しています。この手法は、C言語ではファイルを直接部分的に書き換えることができないためによく使われる定番のアプローチです。
-
TkinterのメニューUIから破線(点線)を削除する方法
TkinterのMenuウィジェットは、アプリケーションのナビゲーションバーにメニューバーを作成するために使用されます。通常、メニューバーはアプリケーションウィンドウの上部、タイトルバーの下に配置されます。メニューをクリックして展開したとき、最初のメニュー項目の上部に破線(点線)が表示されることがあります。これは「ティアオフ(tear-off)」と呼ばれる機能で、ユーザーがメニューをドラッグして独立したウィンドウとして切り離せるようにするためのものです。tearoff属性とはMenuウィジェットにはtearoff(真偽値)という属性があります。デフォルトでは tearoff=1 が設定されてお
-
TkinterのメニューUIから破線(点線)を削除する方法
Tkinterのメニューバーには、縦方向に並べられたメニュー項目が格納されます。メニューバーは Menu(root) オブジェクトを初期化することで作成できます。しかし、アプリケーション内でメニューバーを初期化すると、デフォルトではメニューの先頭に破線(点線)が表示されてしまいます。この破線は「tearoff(ティアオフ)」と呼ばれる機能で、本来はメニューをウィンドウから切り離して独立したウィンドウとして表示できるようにするためのものです。不要な場合は、tearoff プロパティを使って簡単に非表示にできます。具体的には、tearoff=off を指定するだけです。実装例# 必要なライブラリを