C言語関係掲示板

過去ログ

No.180.ファイルを最初の1行以外すべて削除


No.1163

ファイルの内容削除について
投稿者---ドン(2002/03/05 15:38:40)


C言語でファイルの内容を最初の1行だけ残して他の行をすべて削除といった
処理はできるのでしょうか?

お分かりなる方がいましたら教えてください。
お願いします。

OSはLINUX(Redhat)です。

No.1164

Re:ファイルの内容削除について
投稿者---kikk(2002/03/05 17:05:35)


ども。


>C言語でファイルの内容を最初の1行だけ残して他の行をすべて削除といった
>処理はできるのでしょうか?


標準関数の範囲でやるなら、既存のファイル名と重複しないファイルを
開き(tmpnam()が使えるかもしれません)、そこに1行書き込んでから、
remove()で元のファイルを削除し、rename()で新しいファイルを元の
ファイル名にリネームすればOKです。


非標準だけどもう少しスマートなのは、改行がくるまでファイルを先頭から
読み込んで、1行目の文字数をカウントしていって、truncate()か
ftruncate()でファイルサイズを切り詰める方法があります。これらの関数は
たぶんunistd.hで宣言されています。詳細はman等で調べてみてください。
なお、ファイルサイズの変更はDOS/Winではchsize()(io.h)があります。
UNIXを多少意識している感のあるLSI Cでは[f]truncate()もchsize()も
使えるようです(ただしどちらもio.h)。

結果に改行文字を含め、かつ、改行コードがCRFL(2バイト)の場合は、
切り詰めるサイズに注意してください。


ちなみに。
Cでの実現にこだわらないのであれば、
head -1 ファイル名 > tmpfile
mv tmpfile ファイル名
とするのが簡単かと(発想的には最初の方法と同じです)。
# system()でこれを書けば「Cで」といえなくもない!?


では。

No.1187

Re:ファイルの内容削除について
投稿者---C職人(2002/03/06 16:03:31)


>C言語でファイルの内容を最初の1行だけ残して他の行をすべて削除といった
>処理はできるのでしょうか?
>
>お分かりなる方がいましたら教えてください。
>お願いします。
>
>OSはLINUX(Redhat)です。

#include <stdio.h>

#define fileName "c:\\test.txt"

int main(void)
{
FILE *in_fp;
FILE *out_fp;
char line[256];
char *p_line;

/*入力ファイルオープン*/
in_fp=fopen(fileName,"r");
if(in_fp==NULL){
fprintf(stderr,"入力ファイルを開くことができません。\n");
return 1;
}

/*一行リード*/
p_line=fgets(line,256,in_fp);
if(p_line==NULL){
fprintf(stderr,"ファイルにデータが存在しません。\n");
return 1;
}

/*ファイルの削除*/
unlink(fileName);

/*出力ファイルオープン*/
out_fp=fopen(fileName,"w");
if(out_fp==NULL){
fprintf(stderr,"出力ファイルを開くことができません。\n");
return 1;
}

/*ファイル出力*/
fprintf(out_fp,"%s",p_line);

fclose(in_fp);
fclose(out_fp);

return 0;
}

こんな感じじゃまずいですか。原始的に作ってみました。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved