【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20835

文字列の連結
投稿者---ショウ(2005/04/27 21:06:30)


fp1.txt
mojiretsu0 =100
rennketsu0 =123
mojiretsu1 =134
rennketsu1 =223
mojiretsu2 =431
rennketsu2 =140




fp2.txt
123
324
234




上のような2つのファイルがあって。fp2.txtファイルの数字を上から順番に、fp1.txtのmojiretsuX =XXXの=の後のXXXの数字と入れ替えたいんですが、どうしたらいいか分かりません。
文字列を連結する関数であるstrcat()などを使っていろいろやってみたんですが、どうも上手くいきません。この場合どういった関数を使って、そういったシーケンスを考えればいいのでしょうか?
windows2000 で Microsoft VisualC++ を使ってます。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の連結 20837 まきじ 2005/04/27 22:37:06
<子記事> Re:文字列の連結 20838 RiSK 2005/04/27 22:53:44


No.20837

Re:文字列の連結
投稿者---まきじ(2005/04/27 22:37:06)


[fp1.txt]
mojiretsu0 = 100
rennketsu0 = 123
mojiretsu1 = 134
rennketsu1 = 223
mojiretsu2 = 431
rennketsu2 = 140

#include<stdio.h>

int main(void){
    
    FILE *fp1,*fp2;
    char fp1_str[256];
    int fp1_num;
    
    if((fp1 = fopen("fp1.txt","r")) == NULL) return 1;
    if((fp2 = fopen("fp2.txt","w")) == NULL) return 1;
    
    while(fscanf(fp1,"%s = %d",fp1_str,&fp1_num) == 2){
        printf("%s=%d\n",fp1_str,fp1_num);
        fprintf(fp2,"%d\n",fp1_num);
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.20840

Re:文字列の連結
投稿者---まきじ(2005/04/27 23:21:26)


fclose() するの忘れてますね(^^;


この投稿にコメントする

削除パスワード

No.20838

Re:文字列の連結
投稿者---RiSK(2005/04/27 22:53:44)


>上のような2つのファイルがあって。fp2.txtファイルの数字を上から順番に、fp1.txtのmojiretsuX =XXXの=の後のXXXの数字と入れ替えたいんですが、どうしたらいいか分かりません。
#include <stdio.h>
int main(void)
{
    FILE * f1, * f2, * f3;
    const char * const tmp_name = tmpnam(NULL);
    int i, n;
    if ((f1 = fopen("fp1.txt", "r")) == NULL) { return 1; }
    if ((f2 = fopen("fp2.txt", "r")) == NULL) { fclose(f1); return 1; }
    if ((f3 = fopen("tmp.txt", "w")) == NULL) { fclose(f1); fclose(f2); return 1; }
    for (;;) {
        if (fscanf(f1, " mojiretsu%d =%*d", &i) != 1) break;
        if (fscanf(f2, "%d", &n) != 1) break;
        fprintf(f3, "mojiretsu%d =%d\n", i, n);
        if (fscanf(f1, " rennketsu%d =%d", &i, &n) != 2) break;
        fprintf(f3, "rennketsu%d =%d\n", i, n);
    }
    fclose(f1);
    fclose(f2);
    fclose(f3);
    if (remove("fp1.txt") =! 0) return 1;
    if (rename("tmp.txt", "fp1.txt") != 0) return 1;
    return 0;
}



この投稿にコメントする

削除パスワード

No.20839

Re:文字列の連結
投稿者---RiSK(2005/04/27 23:00:44)


>&gt;&gt;上のような2つのファイルがあって。fp2.txtファイルの数字を上から順番に、fp1.txtのmojiretsuX =XXXの=の後のXXXの数字と入れ替えたいんですが、どうしたらいいか分かりません。

fp2.txt を入れ替えるなら,まきじさんのを参考に
fp1.txt を入れ替えるなら,私のを参考にしてください。

    const char * const tmp_name = tmpnam(NULL);
この行いらないです。
# カレントディレクトリじゃないファイル名を作るんだもん
# 最後の rename で失敗する罠
    if (remove("fp1.txt") =! 0) return 1;
!= の間違い



この投稿にコメントする

削除パスワード

No.20842

Re:文字列の連結
投稿者---ショウ(2005/04/27 23:45:11)



>fp2.txt を入れ替えるなら,まきじさんのを参考に
>fp1.txt を入れ替えるなら,私のを参考にしてください。
>
fp2.txtの値をfp1.txtに入れて、fp1.txtを入れ替えたいのでRiskさんのを参考にさせていただきます。
ありがとうございます。


この投稿にコメントする

削除パスワード

No.20844

Re:文字列の連結
投稿者---ショウ(2005/04/28 00:44:52)


if (remove("fp1.txt") =! 0) return 1;
if (rename("tmp.txt", "fp1.txt") != 0) return 1;

最後のほうに上のような記述があるんですが、
これはいったいどういう処理を行っているのでしょうか?
これが無くても欲しい結果は得られるような気がするのですが。


この投稿にコメントする

削除パスワード

No.20847

Re:文字列の連結
投稿者---RAPT(2005/04/28 01:28:13)


>if (remove("fp1.txt") != 0) return 1;
>if (rename("tmp.txt", "fp1.txt") != 0) return 1;
>
>最後のほうに上のような記述があるんですが、
>これはいったいどういう処理を行っているのでしょうか?
>これが無くても欲しい結果は得られるような気がするのですが。
(引用部のソースの間違いを修正しました。)

結果は得られるでしょう。... tmp.txt

fp1.txtとfp2.txtから読み出して、tmp.txtを作成しているのは分かりますか?
ここで、fp1.txtをtmp.txtと置き換えるための処理です。

まずfp1.txtを削除し、次にtmp.txtをfp1.txtにファイル名を変更します。

tmp.txtさえできればいいのであれば、削除・リネームは不要でしょう。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧