C言語関係掲示板

過去ログ

No.207.ファイルを書きかえるプログラム2


No.1292

ファイルを書きかえるプログラム2
投稿者---よっし〜(2002/03/19 19:10:36)


"test.txt"というファイルの中身を書きかえるプログ
ラムを作ったのですが、うまく動きません。

test.txtは、最初以下のような内容になっています。
Member=1,0,111-111-1111,24,1,20,12,12,1,0,0
Member=2,0,222-222-2222,12,0,1,20,12,12,1,0,0
Member=3,0,444-333-1111,11,1,1,20,12,12,1,0,0
Member=4,1,555-333-2222,1,0,1,20,12,12,1,0,0
Member=5,1,22-3333-2222,43,0,1,20,12,13,1,0,0

このtest.txtの1行目を
Member=1,0,111-111-1111,24,0,20,12,12,1,0,0
にして、
3行目を
Member=3,0,444-333-1111,11,0,1,20,12,12,1,0,0
にしたいのですが、このプログラムを実行すると、
test.txtの中身が以下のようになってしまいます。
Member=1,0,111-111-1111,24,0,20,12,12,1,0,0
Member=2,0,222-222-2222,12,0,1,20,12,12,1,0,0
0,0
Member=3,0,444-333-1111,11,1,1,20,12,12,1,0,0
Member=4,1,555-333-2222,1,0,1,20,12,12,1,0,0
Member=5,1,22-3333-2222,43,0,1,20,12,13,1,0,0
Member=3,0,444-333-1111,11,0,1,20,12,12,1,0,0
Member=4,1,555-333-2222,1,0,1,20,12,12,1,0,0
Member=5,1,22-3333-2222,43,0,1,20,12,13,1,0,0

1行目はうまく書き変わるのですが、3行目を書きかえ
る時にうまくいきません。
どこかでメモリを壊しているのでしょうか?
プログラムのソースは、以下のアドレスから
ダウンロードしてみてください。
http://www.geocities.co.jp/HeartLand-Icho/2279/test.txt

分かる方がいましたら、教えてください.
よろしくお願いします。

No.1297

Re:ファイルを書きかえるプログラム2
投稿者---かずま(2002/03/20 01:34:59)


>http://www.geocities.co.jp/HeartLand-Icho/2279/test.txt

これを見ましたが、私にはよく理解できませんでした。
こんなことがしたいのかな。

#include <stdio.h>
#include <string.h>

struct Member {
  int member;
  int field;   /* 0 から始まる */
  char *string;
};

struct Member table[] = {
  { 1, 4, "0" }, /* Member=1 の第4フィールドを "0" にする */
  { 3, 4, "0" }, /* Member=3 の第4フィールドを "0" にする */
};

#define NUM_TABLE (sizeof table / sizeof table[0])

int modify(FILE *fout, const char *buf, int n, const char *str)
{
  int i;
  const char *p1 = buf, *p2;

  for (i = 0; i < n; i++) {
    p1 = strchr(p1, ',');
    if (p1 == NULL) {
      /* printf("can't find the %d'th field\n", n); */
      fputs(buf, fout);
      return 0;
    }
    p1++;
  }
  p2 = strchr(p1, ',');
  if (p2 == NULL)
    p2 = strchr(p1, '\n');
  fprintf(fout, "%.*s%s%s", p1-buf, buf, str, p2);
  return 1;
}

int main()
{
  FILE *fin, *fout;
  char buf[1024];
  int modify_count = 0, member, i;

  fin = fopen("test.txt", "r");
  if (fin == NULL)
    return printf("can't open test.txt\n"), 1;
  fout = fopen("test.tmp", "w");
  if (fout == NULL)
    return printf("can't create test.tmp\n"), 2;

  while (fgets(buf, sizeof buf, fin)) {
    if (sscanf(buf, "Member=%d", &member) != 1) {
      fputs(buf, fout);
      continue;
    }
    for (i = 0; i < NUM_TABLE; i++) {
      if (table[i].member == member) {
        if (modify(fout, buf, table[i].field, table[i].string))
          modify_count++;
        break;
      }
    }
    if (i == NUM_TABLE)
      fputs(buf, fout);
  }
  fclose(fin);
  fclose(fout);

  if (modify_count == 0)
    remove("test.tmp");
  else {
    remove("test.txt");
    rename("test.tmp", "test.txt");
  }
  return 0;
}



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved