Article View: fj.lang.c
Article #615Re: [Q] ファイルの特定の位置を変更
From: Masao Seki
Date: Thu, 19 Mar 1998 00:00
Date: Thu, 19 Mar 1998 00:00
88 lines
3077 bytes
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-mailReferences:
<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