C言語で次のような事は可能でしょうか


長いテキストファイルを
1行読み込み、その1行を削除(空白で埋めるも可)
そして次の行・・。
をファイルの最後まで繰り返す。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答11件)

id:ku__ra__ge No.1

回答回数118ベストアンサー獲得回数40

http://www.kumei.ne.jp/c_lang/index_c.html

�b������INDEX

可能です。

上のページの第18章あたりを参考にしてください。

id:RC30-popo No.2

回答回数345ベストアンサー獲得回数13

結局、ファイル自体は残したままファイルの中身を全部削除したいということでしょうか?


であれば、UNIX系であれば、

truncate(”aaa”,0);

とかで、aaaというファイルの中身は全部消えます。


truncate()が使えなければ、


FILE *fp = fopen(”aaa”,”w”);

fclose(fp);

とかで、上書きモードでopenしてすぐにcloseすればできるような気がしますが。


やりたいこと自体が違うのかな?

id:yamazakiis

1行づつ読み込んで処理をしたいのです。

そして読み込んだ行がわかる様に、その行を削除(もしくは空白で埋める)をしたいと思っています。

2005/07/09 02:48:21
id:sho1008 No.3

回答回数23ベストアンサー獲得回数0

http://www.hatena.ne.jp/1120842807#

人力検索はてな - C言語で次のような事は可能でしょうか 長いテキストファイルを 1行読み込み、その1行を削除(空白で埋めるも可) そして次の行・・。 をファイルの最後まで繰り返す。..

空白で埋めるも可であるなら、

1行読み込んだバッファにmemsetなどで

空白入れて書き込むとか。

NULLセットして書き込むとかで良いのでは?

C++ならreplaceしちゃうとかで。

id:yamazakiis

そのやり方が分からないんですよね。

サンプルソースとかある場所分かりませんかねぇ

2005/07/09 02:59:01
id:akihatehiro No.4

回答回数54ベストアンサー獲得回数0

http://www.hoge.com/

Hoge Lumber Company

ダミーです。

行を削除というのは、行の先頭に改行があるようにすることですよね。

だったら

getc なり fgetc かなんか使って行の数を数えて

同じ数だけ改行を出力すればよいのではないでしょうか。

id:yamazakiis

下記のソースでテキストファイルが空白に置き換えられません。

理由が分かる方いましたら、よろしくお願いします。

FILE * fp = fopen(”C:¥¥0.txt”,”r+”);

char szStrRcpt[1024];

while( fgets(szStrRcpt, sizeof(szStrRcpt), fp ) )

{

memset(szStrRcpt,’¥0’, sizeof(szStrRcpt));

fputs(szStrRcpt, fp);

}

fclose(fp);

return;

2005/07/09 03:30:46
id:YasudaS No.5

回答回数351ベストアンサー獲得回数5

ftell()で今読む所を得て、編集。rewind(),fseek()して、fwrite()、またfseek()で出来ますが...

id:RC30-popo No.6

回答回数345ベストアンサー獲得回数13

ポイント30pt

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

MSDN ライブラリ サイト移行に関する重要なお知らせ

標準C関数を使うならftell()とfseek()で読み込んだ後、行の先頭にファイルポインタを戻してから書き込みでしょうね。


エラー処理とか全部はしょってますが、下記のコードでWindowsXP+lccwin32(フリーのコンパイラ)でだいたい想定どおりに動きました


読み出した行の内容を行番号付きで表示しながら空白を書き込みます。


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int main(int argc,char *argv[])

{

FILE *fp;

long posi1,posi2;

int linelen;

int linenum = 1;

char buffer[1024];


/* ファイルをRead/Writeモードでopen */

fp = fopen(argv[1],”r+b”);


while(1){

/* 行先頭のファイル位置を取得 */

posi1 = ftell(fp);

/* 1行読み込み */

if(fgets(buffer,1023,fp) == NULL){

break;

}

/* 次の行の先頭のファイル位置を取得 */

posi2 = ftell(fp);

/* 読み込んだ行を表示 */

printf(”LINE%05d: %s”,linenum,buffer);

linelen = strlen(buffer);

/* 読み込んだ行を空白で埋める */

if(linelen > 1){

memset(buffer,’ ’,linelen - 1);

}

/* 行先頭のファイル位置をシーク */

fseek(fp,posi1,SEEK_SET);

/* 空白で埋めた行を出力 */

fputs(buffer,fp);

/* 次の行の先頭のファイル位置をシーク

...これは要らない気がするが..

WindowsXP + lccwin32ではこれが 無いと動かない */

fseek(fp,posi2,SEEK_SET);

linenum++;

}


fclose(fp);


return 0;

}

id:rhizomedia No.7

回答回数51ベストアンサー獲得回数0

ポイント80pt

FILE *fp;

char rbuf[BUF_SIZE];

char wbuf[BUF_SIZE];

int i = 0;

long line_head = 0, line_end = 0;

fp = fopen(”test.txt”, ”r+”);

if(fp){

while(1){

line_head = ftell(fp);

if(fgets(rbuf, BUF_SIZE, fp) == NULL){

exit(0);

}

line_end = ftell(fp);


wbuf[0] = ’¥0’;

for(i = 0; i < line_end-line_head-1; i++){

sprintf(wbuf, ”%s*”, wbuf);

}


sprintf(wbuf, ”%s¥n”, wbuf);

printf(”%s”, wbuf);

if(fseek(fp, line_head, SEEK_SET) == 0){

fputs(wbuf, fp);

}

}


上記のプログラムで、読み込んだ行の文字の分だけ ’*’をファイルに書き出します。

’*’をスペースにすれば、ファイルを空白で埋めることも可能です。

Vine 3.1 で動作確認しました。

id:nkasa No.8

回答回数11ベストアンサー獲得回数0

「空白で置き換えられない」のなら、具体的にどうなってしまうのでしょうか?それをどうやって確認していますか(テキストエディタで確認している、とか)。

空白で埋めたいのなら、

memset(szStrRcpt,’¥0’, sizeof(szStrRcpt));

ではなく

memset(szStrRcpt,’ ’, sizeof(szStrRcpt));

ですけれど。

id:yamazakiis

なにも変化がありません。

テキストエディタで確認しました。

また、そのように変更しましたが、結果変わりませんでした

2005/07/09 12:19:05
id:aki73ix No.9

回答回数5224ベストアンサー獲得回数27

ポイント30pt

>下記のソースでテキストファイルが空白に置き換えられません。

>理由が分かる方いましたら、よろしくお願いします。


ソースのおかしい場所を修正しておきました


FILE *fp = fopen("test.txt","r+");

char szStrRcpt[1024];

int p=0;//ファイルポインタの保存

while( fgets(szStrRcpt, sizeof(szStrRcpt), fp ) )

{

// memset(szStrRcpt,’¥0’, sizeof(szStrRcpt));

//まず、NULL文字で埋めるとテキストファイルは開けなくなってしまいますからスペースなどで

//つぶす方がいいでしょう、あと sizeof(szStrRcpt)にすると読み込んだバイトに関係なく1024

//バイトつぶされるので書き込むとそれ以降のデータがつぶされてしまいます

//ここはstrlenを使います、読み込んだデータはテキストなので最後に改行コードが入っている

//はずですから1ばいと引いておきます

if(*szStrRcpt)

memset(szStrRcpt,0x20, strlen(szStrRcpt)-1);


fseek(fp,p,SEEK_SET);

// そのままfputsすると読んだ後ろに書き込んでしまうことになります

// 読んだ後、読み込んだ分fseekでファイルポインタを戻さないと上書きできません


fputs(szStrRcpt, fp);

p=ftell(fp);

fseek(fp,p,SEEK_SET);

//書き込みをするとそこをファイル終端にされてしまうのでftell/fseekで再定義しなおします

}

fclose(fp);

return;


置換の場合は、上のように簡単にできますが、ANSI-Cで行削除の場合は、ファイルサイズが変わってしまうので、別のファイル(テンポラリ)に書き込んだ後、そのファイルをコピーした方がよいです

id:virus No.10

回答回数183ベストアンサー獲得回数1

http://www.hatena.ne.jp/1120842807

人力検索はてな - C言語で次のような事は可能でしょうか 長いテキストファイルを 1行読み込み、その1行を削除(空白で埋めるも可) そして次の行・・。 をファイルの最後まで繰り返す。..

空白で埋めたいのなら、

memset(szStrRcpt,’¥0’, sizeof(szStrRcpt));

ではなく

memset(szStrRcpt,’ ’, strlen(szStrRcpt));

です。

これで改行も全部空白になるはずですが?

なお実際の変化はクローズした後、場合によってはそのソフトが終了してからでないと反映されないかも。

id:virus No.11

回答回数183ベストアンサー獲得回数1

すみません、もう一点大事なこと忘れてました。

と言うか、7番目の人が書いてるからいいか(笑

つまり、fgets した時点でポインター進んでますので、戻してから fputs してやらないとダメです。


ただ、普通の処理的に言うと、こういう読みながら上書きする処理はあまりお勧めは出来ません。普通は別ファイルに書き出して、クローズしてから元のファイルを消してリネームってやります。

  • id:YasudaS
    点数の付与具合からわかった。

    この質問者ちゃん

    > C言語で次のような事は可能でしょうか

    と質問していながら、「次のような事が出来るソース」をほしがっていたんだね。

    質問の文面を理解できないで質問しちゃう人っていますね。
    実際に欲しいモノを書かないとだめだめですね。
  • id:debedebe
    Re:点数の付与具合からわかった。

    > C言語で次のような事は可能でしょうか
    という質問にもかかわらず、使う関数まで答えてるよな、お前。
    「出来ますよ」とだけ答えるのはさすがに気がとがめたか。
    低脳質問者に対して回答お疲れさん。役不足でしたか?
    もうひとつ。
    文の作成者が言い回し、文面を考えることを「理解」とは言わないんじゃないか?
    「推敲」とかさ、あるだろ。もっと意に沿った単語が。
    「日本語って分かりますか?」とかいっときながら結構危ないぜYasudaSさん。
  • id:dasm
    Re(2):点数の付与具合からわかった。

    YasudaS の人がおかしな事を言っているとは思いませんが。
    質問者が聞きたい内容と質問文から読み取れる質問内容にずれがある。
    質問者は自分が書いた質問文をよく理解して、質問したい内容とずれていたら質問する前に修正すべきだろう。
    いわしでのこういう指摘は非常に有意義であって、下らない茶茶や揚げ足取りで汚されてよい事ではないと思います。

    > 「推敲」とかさ、あるだろ。もっと意に沿った単語が。
    意味のある部分はここだけでしょうか。いわしで最適な指摘をしろというルールはどこにもありませんが。
    > 文の作成者が言い回し、文面を考えることを「理解」とは言わないんじゃないか?
    「フレームのもと」ですね。曲解して得意になっている、と。よくある光景ですが結構「危ない」です。
  • id:YasudaS
    (投稿者削除)

  • id:YasudaS
    Re(2):点数の付与具合からわかった。

    >> C言語で次のような事は可能でしょうか
    >という質問にもかかわらず、使う関数まで答えてるよな、お前。

    はい、どうやったら出来るかってこととしてね。

    >「出来ますよ」とだけ答えるのはさすがに気がとがめたか。

    debedebe程度の知能だと、何も示さずにいないとだめってことね。

    >低脳質問者に対して回答お疲れさん。役不足でしたか?

    いえ、あなたの知能不足ですね。

    >「日本語って分かりますか?」とかいっときながら結構危ないぜYasudaSさん。

    いえいえ、危ないのはdebedebeちゃんみたいなオツムですね。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません