C言語関係掲示板

過去ログ

No.1146 テキストファイルを読み込み、置換(追記?)して出力

[戻る] [ホームページ]
No.14605

テキストファイルを読み込み、置換(追記?)して出力
投稿者---モロr(2004/06/13 15:44:05)


あるテキストファイルの文字を読み込み、置換するというプログラムを作ろうとしています。文章じゃうまく説明できないので、下に例を示します。

読み込むファイルの内容
----------------------
1 23
6 46
3 48
7 32
----------------------

置換(追記?)後のファイルの内容
----------------------
set_number:1, data[23]
set_number:6, data[46]
set_number:3, data[48]
set_number:7, data[32]
----------------------

また、このような場合は追記することは出来るんでしょうか?
それとも新しくファイルを作成させなければいけないのでしょうか?

よろしくお願いします。








No.14609

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---RAPT(2004/06/13 19:04:08)


一度全部をメモリに読み込んで、同じファイルに整形したものを書き出す
ことは可能です。もちろん、新規ファイルに書き出すことも可能です。

ただし、変換元データが大量にある場合、対応を検討する必要がありますが。


No.14613

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---モロr(2004/06/14 08:22:45)


おはようございます。
RAPTさん、ありがとうございました。
ファイルを新しく作るという方向でソースを作っています。
下のようなものを作ったのですが、今度は数値ではなく文字列にも対応できるようにしたいのです。どのようにしたらよいのでししょうか?

--------------------------------
#include<stdio.h>
#include <stdlib.h>

int main(void){

int i=0,j=0;
int a[100],b[100];
char infile[50],outfile[50];
FILE *fp1, *fp2;

printf("入力ファイル名\n>");
gets(infile);
printf("出力ファイル名\n>");
gets(outfile);

if(NULL==(fp1=fopen(infile,"r")))
{
printf("\n %s can not be opened\n",infile);
exit(1);
}

if(NULL==(fp2=fopen(outfile,"w")))
{
printf("\n %s can not be opened\n",outfile);
exit(1);
}

while(fscanf(fp1,"%d\t%d",&a[i],&b[i])!=EOF)
{
i++;
}

for(j=0; j <i;j++)
fprintf(fp2,"%d\t%d\n",a[j],b[j]);

fclose(fp1);
fclose(fp2);

return(0);
}


No.14614

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---REE(2004/06/14 09:45:58)


>下のようなものを作ったのですが、今度は数値ではなく文字列にも対応できるようにしたいのです。どのようにしたらよいのでししょうか?

そのように変更するだけだと思うのですが、どこが疑問なのでしょうか?


また、このままのプログラムでは、100行以上あった時に破綻します。
結果を記憶する必要が無ければ、a,bを配列にするのをやめて、
下記の様にすればよいでしょう。


while(fscanf(fp1,"%d\t%d",&a,&b)!=EOF)
{
    fprintf(fp2,"%d\t%d\n",a,b);
}




No.14616

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---モロr(2004/06/14 12:32:05)


>そのように変更するだけだと思うのですが、どこが疑問なのでしょうか?

そのように変更とは
int a[100],b[100]; → char a[100],b[100];
%d → %s
ということでしょうか?
違っていたら教えていただくとありがたいです。


>結果を記憶する必要が無ければ、a,bを配列にするのをやめて、
>下記の様にすればよいでしょう。

そのとおりでしたね。ご指摘ありがとうございます。


No.14617

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---REE(2004/06/14 13:38:04)


>>そのように変更するだけだと思うのですが、どこが疑問なのでしょうか?
>
>そのように変更とは
>int a[100],b[100]; → char a[100],b[100];
>%d → %s
>ということでしょうか?
>違っていたら教えていただくとありがたいです。

あなたの目指すところが具体的ではないので、判断できませんが、
以下の様にするつもりでしたら、間違っています。
char a[100],b[100];

fscanf(fp1,"%s\t%s",&a[i],&b[i])




No.14619

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---モロr(2004/06/14 16:52:34)


>あなたの目指すところが具体的ではないので、判断できません

現在作りたいプログラムは一番はじめの書き込みを見ていただければ分かりますように、
ファイルから文字列を読みとり、その文字列の前後に文字を加えて新しいファイルに書き出すというものです。

>以下の様にするつもりでしたら、間違っています。

やはり間違っていますよね。書き込んだ後にしてみたら動きませんでした・・・
どのような関数を使えばいいんでしょうか?
なにぶん最近始めたもので、分からないことだらけです。


No.14620

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---REE(2004/06/14 17:05:20)


>やはり間違っていますよね。書き込んだ後にしてみたら動きませんでした・・・

書き込む前に試して、結果も合わせて書くとよいです。

>どのような関数を使えばいいんでしょうか?
>なにぶん最近始めたもので、分からないことだらけです。

別に、新たな関数を使う必要はありません。
例えば、以下の様にすれば出来ると思います。(動作未確認)
先程の例との違いを把握してください。

char a[100],b[100];

/* */

while(fscanf(fp1,"%s\t%s",a,b)!=EOF)
{
    fprintf(fp2,"%s\t%s\n",a,b);
}



ただ、このままでは、バッファオーバーランの可能性がありますので、
ご注意ください。


No.14651

Re:テキストファイルを読み込み、置換(追記?)して出力
投稿者---モロr(2004/06/15 22:07:10)


REEさん、おかげでプログラムが完成しました。ありがとうございました。

>書き込む前に試して、結果も合わせて書くとよいです。
そうですよね。次から気をつけたいと思います。