Thread View: fj.lang.c
13 messages
13 total messages
Started by sierra
Wed, 11 Mar 1998 00:00
[Q] ファイルの特定の位置を変更
Author: sierra
Date: Wed, 11 Mar 1998 00:00
Date: Wed, 11 Mar 1998 00:00
10 lines
947 bytes
947 bytes
瑞原と申します。よろしくお願いします。 既にあるファイルを開き、特定の位置を変更するプログラムを考えています。 fopenで開きfseekで特定の位置に移動しfwriteで書き込んでfcloseで終了した のですが、fwriteで書き込んだ位置以降が消えてなくなっています。 ファイルの特定の位置を変更するにはどうすればいいものでしょうか… よろしくお願いします。
Re: [Q] ファイルの特定の位置を変更
Author: t.hagiwara
Date: Thu, 12 Mar 1998 00:00
Date: Thu, 12 Mar 1998 00:00
23 lines
1478 bytes
1478 bytes
sierra wrote in message <3506A0D3.3AA59CDA@geocities.co.jp>...
>瑞原と申します。よろしくお願いします。
>
>既にあるファイルを開き、特定の位置を変更するプログラムを考えています。
>
>fopenで開きfseekで特定の位置に移動しfwriteで書き込んでfcloseで終了した
>のですが、fwriteで書き込んだ位置以降が消えてなくなっています。
>
>ファイルの特定の位置を変更するにはどうすればいいものでしょうか…
>よろしくお願いします。
fopen(char *filname , char *mode);
^^^^^^^^^^--- この設定どうされてます?
もし "w" でオープンされているとすれば、新規ファイルとして扱われますので
既存のファイルはクリアされしまいます。
既にあるファイルを開き、特定の位置を変更するのであれば "r+" で
ファイルをオープンすれば上手く行くと思います。
hagi.
Re: [Q] $B%U%!%$%k$NFCDj$N0LCV$rJQ99(B
Author: Junn Ohta
Date: Thu, 12 Mar 1998 00:00
Date: Thu, 12 Mar 1998 00:00
15 lines
1113 bytes
1113 bytes
fj.lang.c$B$N5-;v(B<3506A0D3.3AA59CDA@geocities.co.jp>$B$G(B sierra@geocities.co.jp$B$5$s$O=q$-$^$7$?!#(B > fopen$B$G3+$-(Bfseek$B$GFCDj$N0LCV$K0\F0$7(Bfwrite$B$G=q$-9~$s$G(Bfclose$B$G=*N;$7$?(B > $B$N$G$9$,!"(Bfwrite$B$G=q$-9~$s$@0LCV0J9_$,>C$($F$J$/$J$C$F$$$^$9!#(B $B$U$D$&$O$=$&$O$J$i$J$$$H;W$&$N$G$9$,(B...$B!#(B MS-DOS$B$+(BWindows$B$G!"%F%-%9%H7A<0$G%U%!%$%k$r%*!<%W(B $B%s$7$F0lO"$NA`:n$r$7$F$$$?$j$7$^$;$s$+(B? $B$=$&$G$"$l(B $B$P!"%P%$%J%j!<7A<0$G%U%!%$%kA`:n$r$9$k$h$&$K%W%m%0(B $B%i%`$rJQ99$9$l$P2r7h$G$-$=$&$K;W$$$^$9!#(B -- $BB@ED=c(B(Junn Ohta) ($B3t(B)$B%j%3!<(B MS$B;v6H?d?J<<(B ohta@src.ricoh.co.jp/JCF00656@niftyserve.or.jp
Re: [Q] $B%U%!%$%k$NFCDj$N0LCV$rJQ99(B
Author: Toshihiro Kanda
Date: Thu, 12 Mar 1998 00:00
Date: Thu, 12 Mar 1998 00:00
17 lines
1158 bytes
1158 bytes
In article <6e7jt5$g5a@ns.src.ricoh.co.jp> ohta@src.ricoh.co.jp (Junn Ohta) writes: > > fopen$B$G3+$-(Bfseek$B$GFCDj$N0LCV$K0\F0$7(Bfwrite$B$G=q$-9~$s$G(Bfclose$B$G=*N;$7$?(B > > $B$N$G$9$,!"(Bfwrite$B$G=q$-9~$s$@0LCV0J9_$,>C$($F$J$/$J$C$F$$$^$9!#(B > > $B$U$D$&$O$=$&$O$J$i$J$$$H;W$&$N$G$9$,(B...$B!#(B > > MS-DOS$B$+(BWindows$B$G!"%F%-%9%H7A<0$G%U%!%$%k$r%*!<%W(B > $B%s$7$F0lO"$NA`:n$r$7$F$$$?$j$7$^$;$s$+(B? $B$=$&$G$"$l(B $B%I%9$G$O!"(Bunix $B$N(B write(2) $BAjEv$N%7%9%F%`%3!<%k(B(?)$B$G(B 0 $B%P%$%H$r=q$-9~(B $B$`$H!"$=$3$G%U%!%$%k$,$A$.$l$k$H$$$&HkL)$N5!G=$,$"$j$^$;$s$G$7$?(B? $B0U30$H$=$l$,860x$+$b!D!D(B $B?@EDIR9-(B <candy@fct.kgc.co.jp>
Re: [Q] ファイルの特定の位置を変更
Author: Toyomi Nakayama
Date: Thu, 12 Mar 1998 00:00
Date: Thu, 12 Mar 1998 00:00
26 lines
1723 bytes
1723 bytes
中山と申します。 Junn Ohta wrote in message <6e7jt5$g5a@ns.src.ricoh.co.jp>... >fj.lang.cの記事<3506A0D3.3AA59CDA@geocities.co.jp>で > sierra@geocities.co.jpさんは書きました。 >> fopenで開きfseekで特定の位置に移動しfwriteで書き込んでfcloseで終了した >> のですが、fwriteで書き込んだ位置以降が消えてなくなっています。 > >ふつうはそうはならないと思うのですが...。 > >MS-DOSかWindowsで、テキスト形式でファイルをオープ >ンして一連の操作をしていたりしませんか? そうであれ >ば、バイナリー形式でファイル操作をするようにプログ >ラムを変更すれば解決できそうに思います。 >-- 多分fopenの第2引数が"a"になっているのだと思うんですが・・・。 確かこういう場合は"r+"でないといけないような記憶が(不鮮明(T_T)) -- 中山豊実@SoftwareSmith toysmith @ mail.interq.or.jp <-ここから出しています。 toysmith @ coo.net <-メールはこっちへお願いします。 容量でかいっす
Re: [Q] $B%U%!%$%k$NFCDj$N0LCV$rJQ99(B
Author: YUKI
Date: Fri, 13 Mar 1998 00:00
Date: Fri, 13 Mar 1998 00:00
17 lines
1255 bytes
1255 bytes
$B5-;v(B<3506A0D3.3AA59CDA@geocities.co.jp>$B$G$N(B,
sierra <sierra@geocities.co.jp> $B$5$s$N<!$N5-=R$K4X$7$F(B:
> $B4{$K$"$k%U%!%$%k$r3+$-!"FCDj$N0LCV$rJQ99$9$k%W%m%0%i%`$r9M$($F$$$^$9!#(B
>
> fopen$B$G3+$-(Bfseek$B$GFCDj$N0LCV$K0\F0$7(Bfwrite$B$G=q$-9~$s$G(Bfclose$B$G=*N;$7$?(B
> $B$N$G$9$,!"(Bfwrite$B$G=q$-9~$s$@0LCV0J9_$,>C$($F$J$/$J$C$F$$$^$9!#(B
>
> $B%U%!%$%k$NFCDj$N0LCV$rJQ99$9$k$K$O$I$&$9$l$P$$$$$b$N$G$7$g$&$+!D(B
$B!!(Bfopen() $B4X?t$KEO$9Bh#20z?t$r(B"r+"$B$K$9$l$P2r7h$9$k$H;W$$$^$9!#(B
$B3N$+$K(B fopen() $B4X?t$NBh#20z?t$O$d$d$3$7$$$G$9$,!"(B
$B$$$m$$$m;n$7$F$_$l$P(B fopen() $B$NF0:n$K$b47$l$k$N$G$O$J$$$G$7$g$&$+!)(B
$B!J;d$O%F%9%H%W%m%0%i%`$r$D$/$C$F;n$9$^$G(B "r+" $B$H(B "w+" $B$N$I$A$i$r(B
$B!!;H$&$Y$-$+3P$($F$$$J$+$C$?!D!D!#!K(B
$B!!(Byuki_shiino_@mvj.biglobe.ne.jp$B!!DGLn!!M5<y(B
Re: [Q] $B%U%!%$%k$NFCDj$N0LCV$rJQ99(B
Author: Junn Ohta
Date: Fri, 13 Mar 1998 00:00
Date: Fri, 13 Mar 1998 00:00
11 lines
1009 bytes
1009 bytes
fj.lang.c$B$N5-;v(B<3507a7df.0@news.interq.or.jp>$B$G(B toysmith@mail.interq.or.jp$B$5$s$O=q$-$^$7$?!#(B > $BB?J,(Bfopen$B$NBh#20z?t$,(B"a"$B$K$J$C$F$$$k$N$@$H;W$&$s$G$9$,!&!&!&!#(B > $B3N$+$3$&$$$&>l9g$O(B"r+"$B$G$J$$$H$$$1$J$$$h$&$J5-21$,!JITA/L@(B(T_T)$B!K(B $B$J$k$[$I(B...$B!#$=$l$b(BMS-DOS$B$NFCJL;EMM(B:-)$B$G$7$?$C$1(B? $B$$$:$l$K$7$F$b(BUNIX$B$G$O5/$-$J$$OC$G$9$M!#(B -- $BB@ED=c(B(Junn Ohta) ($B3t(B)$B%j%3!<(B MS$B;v6H?d?J<<(B ohta@src.ricoh.co.jp/JCF00656@niftyserve.or.jp
Re: [Q] ファイルの特定の位置を変更
Author: sierra
Date: Tue, 17 Mar 1998 00:00
Date: Tue, 17 Mar 1998 00:00
16 lines
1138 bytes
1138 bytes
瑞原です。 多くの意見を頂き感謝しております。 さっそく、ヘルプと記事を見ながらソースを見てみました。 fopenのヘルプを見ながら作っていたせいか r+ には元から なっており、同じ結果がでてしまいました。 ひょっとすると、fwriteとfputなどを使う場合とでは結果が 違うのでしょうか? 私にはこの当たりがよく分かりません。 私のコンピュータでのC言語の環境は MS-Windows95 Visual C++ 5.0 Console です。 何卒、ご教授お願いいたします。
Re: [Q] ファイルの特定の位置を変更
Author: t.hagiwara
Date: Wed, 18 Mar 1998 00:00
Date: Wed, 18 Mar 1998 00:00
27 lines
1713 bytes
1713 bytes
sierra wrote in message <350D5595.305069F8@geocities.co.jp>...
>瑞原です。
>
>多くの意見を頂き感謝しております。
>さっそく、ヘルプと記事を見ながらソースを見てみました。
>fopenのヘルプを見ながら作っていたせいか r+ には元から
>なっており、同じ結果がでてしまいました。
>
>ひょっとすると、fwriteとfputなどを使う場合とでは結果が
>違うのでしょうか?
>私にはこの当たりがよく分かりません。
>私のコンピュータでのC言語の環境は
>MS-Windows95 Visual C++ 5.0 Console
>です。
>
>何卒、ご教授お願いいたします。
作成されたデータの確認はどのように行ってますでしょうか?
一度作成されたデータを16進DUMPしてみることをお勧めします。
ファイルをテキストモードでオープンした場合途中にEOF(0x1a)があるとそ
こから先は読み込めません。
バイナリモードでオープンするか途中にEOFが入らないような工夫が必要だと思い
ます。
間違ってたらごめんなさい
hagi.
Re: [Q] ファイルの特定の位置を変更
Author: Yasuhiko Gotoh
Date: Wed, 18 Mar 1998 00:00
Date: Wed, 18 Mar 1998 00:00
33 lines
2109 bytes
2109 bytes
後藤ともうします。
改行位置を変更させていただいています。
fj.lang.c の <3506A0D3.3AA59CDA@geocities.co.jp> の
記事において 1998年03月11日(水) 23時33分55秒頃、
sierraさんは書きました。
sierraさん>> 瑞原と申します。よろしくお願いします。
sierraさん>>
sierraさん>> 既にあるファイルを開き、特定の位置を変更する
sierraさん>> プログラムを考えています。
sierraさん>>
sierraさん>> fopenで開きfseekで特定の位置に移動しfwriteで
sierraさん>> 書き込んでfcloseで終了した
sierraさん>> のですが、fwriteで書き込んだ位置以降が消えてなくなっています。
sierraさん>>
sierraさん>> ファイルの特定の位置を変更するにはどうすればいいものでしょうか…
sierraさん>> よろしくお願いします。
fcloseするときに再度fseekでファイルの一番後ろにファイルポインタを
持っていくとよいのではないかと思います。
#たしかfcloseが現在のファイルポインタで切ってしまうのでは
オープンモード等忘れましたがrb+なども試してみてください。
もし間違いでしたら、本文は無視してください。
では
-----------------------------------------------------------------
後藤安彦@関西事業所 OP制御システム 第8システム部
E-Mail : gotoh@kso.njk.co.jp
Tel_No : 06-350-3605
Fax_No : 06-350-3645 , 3646
-----------------------------------------------------------------
Re: [Q] ファイルの特定の位置を変更
Author: Yasuhiko Gotoh
Date: Wed, 18 Mar 1998 00:00
Date: Wed, 18 Mar 1998 00:00
96 lines
3712 bytes
3712 bytes
後藤です。
自己フォローです。
fj.lang.c の <6enn9u$phh@voyager.kso.njk.co.jp> の
記事において 1998年03月18日(水) 14時49分50秒頃、
gotohさんは書きました。
>> 後藤ともうします。
>> 改行位置を変更させていただいています。
>>
>> fj.lang.c の <3506A0D3.3AA59CDA@geocities.co.jp> の
>> 記事において 1998年03月11日(水) 23時33分55秒頃、
>> sierraさんは書きました。
>>
>> sierraさん>> 瑞原と申します。よろしくお願いします。
>> sierraさん>>
>> sierraさん>> 既にあるファイルを開き、特定の位置を変更する
>> sierraさん>> プログラムを考えています。
>> sierraさん>>
>> sierraさん>> fopenで開きfseekで特定の位置に移動しfwriteで
>> sierraさん>> 書き込んでfcloseで終了した
>> sierraさん>> のですが、fwriteで書き込んだ位置以降が消えてなくなっています。
>> sierraさん>>
>> sierraさん>> ファイルの特定の位置を変更するにはどうすればいいものでしょうか…
>> sierraさん>> よろしくお願いします。
>>
>> fcloseするときに再度fseekでファイルの一番後ろにファイルポインタを
>> 持っていくとよいのではないかと思います。
>> #たしかfcloseが現在のファイルポインタで切ってしまうのでは
>> オープンモード等忘れましたがrb+なども試してみてください。
>>
>> もし間違いでしたら、本文は無視してください。
少し気になったのでサンプルプログラムを作ってみました。
実行確認
1)TurboC Ver2.0 (MSDOS)
2)Microsoft VC++ Ver5.0(PC9801 Win95)
3)SunOS 5.4 / gcc version 2.6.0
-------- data.1の中身 ------------
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
------- ここまで ----------------
------- sample program ---------
#include <stdio.h>
main()
{
FILE *fp;
char buf[20];
fp=fopen("data.1","r+");
fseek(fp, 12, 0); /* Sunでは 12, 1 は 11, 1 */
fread(buf, 10, 1, fp);
buf[11]=0;
printf("buf = %s", buf);
strcpy(buf, "abcdefghij");
fseek(fp, 12, 0);
fwrite(buf, 10, 1, fp); /* Sunでは 12, 1 は 11, 1 */
/*
fseek( fp, 0, 2);
*/
fclose( fp );
}
------ ここまで -------------
上記をコンパイル実行しましたが、
最後のfseekの有無に関わらず、data1の中身は
-------- data.1の中身 ------------
0123456789
abcdefghij
0123456789
0123456789
0123456789
0123456789
------- ここまで ----------------
と変更され、書き込んだ後がなくなるという現象は
確認できませんでした。
うーん、どこがどうなっているのでしょうかね。
サンプルソフトが、ご参考になれば幸いです。
では
-----------------------------------------------------------------
後藤安彦@関西事業所 OP制御システム 第8システム部
E-Mail : gotoh@kso.njk.co.jp
Tel_No : 06-350-3605
Fax_No : 06-350-3645 , 3646
-----------------------------------------------------------------
Re: [Q] ファイルの特定の位置を変更
Author: sierra
Date: Thu, 19 Mar 1998 00:00
Date: Thu, 19 Mar 1998 00:00
7 lines
824 bytes
824 bytes
瑞原です。 ご返信ありがとうございます。 サンプルソースが非常に役に立ちました。 ソースを参考にして、 もう少し試行錯誤しようと思います。
Re: [Q] ファイルの特定の位置を変更
Author: 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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads