🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #615

Re: [Q] ファイルの特定の位置を変更

#615
From: Masao Seki
Date: Thu, 19 Mar 1998 00:00
88 lines
3077 bytes
最近、あちこちに図々しく首を突っ込んでます関です。

Yasuhiko Gotoh wrote:

> 少し気になったのでサンプルプログラムを作ってみました。

何だか、面白そうな展開になってきたので、私も実験してみました。
テキストファイルに対して、freadやfwriteを使うのは少し具合が悪いな
と思いまして、最後に付けてあるプログラムを走らせてみました。

環境は、VC++ 5.0 Pro on Windows95です。

それで、実を言うとfprintfで書き込みをするとちょん切れて、fwrite
ならOKになる事を予想して試してみたのですが、意外にも(?)どちら
も同じ結果で、ちょん切れるという現象は確認できませんでした。

それで、面白いなと思った事は、中程のfseekを
    fseek(fp, 0L, SEEK_CUR);
とすると、(最後にfgetsした行と次の行の長さが同じでないとまずいです
が)とにかくデータの書き換えをするのですが、一見無意味そうなこのfseek
文をとってしまうと全然書き換えをしてくれないのです。

思うに、ファイルアクセスには、読込み用と書き込み用の2種類のポインタ
があり、 fgetsやfreadは、読み込み用のポインタは進めるけど、書込み用に
は影響を与えず、fseekはどちらにも同じ作用をするのではないでしょうか。
どなたかこの辺に詳しい方、間違っていましたら訂正をお願いします。

ちょん切れる現象の原因は、申し訳ありませんが分かりませんでした。
-- 
関 正生 <masao.seki@fujixerox.co.jp || ma-seki@gb3.so-net.or.jp>


> type partialChange.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int ac, char **av)
{
	int n, n9 = 3;
	char cbuf[256], cfile[] = "data1.txt";
	char *str = "ABCDEFGHIJKLMN";
	size_t len, slen = strlen(str);
	FILE *fp;

	if (ac == 1) n9 = 3;
	else n9 = atoi(av[1]);
	if ((fp = fopen(cfile, "r+")) == NULL) {
		fprintf(stderr, "Can't open file: %s\n", cfile);
		return 1;
	}

	for (n=0; n < n9; n++) fgets(cbuf, 256, fp);
	len = strlen(cbuf);
	fseek(fp, -((long)len+1), SEEK_CUR);
	strncpy(cbuf, str, ((slen < len) ? slen : len) - 2);
	// len >= 3 を 仮定。
	fprintf(stdout, "%d: %s\n", n9, cbuf);
	// fprintf(fp, "%s", cbuf);
	fwrite(cbuf, 1, len, fp);

	fclose(fp);
	return 0;
}

> type data1.txt
123456789
23456789
3456789
456789
56789
6789
789
89

> partialChange 2
2: ABCDEFG9

> type data1.txt
123456789
ABCDEFG9
3456789
456789
56789
6789
789
89
Technical Details
Message-ID: <351004A0.12DE@gb3.so-net.or.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <3506A0D3.3AA59CDA@geocities.co.jp> <6enn9u$phh@voyager.kso.njk.co.jp> <6enu63$sq7@voyager.kso.njk.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 106434,8a84d598efbbed25
X-Google-Attributes: gid106434,public
From: Masao Seki <ma-seki@gb3.so-net.or.jp>
Subject: Re: [Q] ファイルの特定の位置を変更
Date: 1998/03/19
Message-ID: <351004A0.12DE@gb3.so-net.or.jp>
X-Deja-AN: 335298130
Content-Transfer-Encoding: 7bit
References: <3506A0D3.3AA59CDA@geocities.co.jp> <6enn9u$phh@voyager.kso.njk.co.jp> <6enu63$sq7@voyager.kso.njk.co.jp>
Mime-Version: 1.0
Reply-To: ma-seki@gb3.so-net.or.jp
Content-Type: text/plain; charset=iso-2022-jp
Organization: So-net
Newsgroups: fj.lang.c