C言語関係掲示板

過去ログ

No.1122 ファイル分割プログラム

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

ファイル分割プログラム
投稿者---のんたん(2004/06/14 11:10:32)


A.datというファイルがありその中身を100行ずつ取り出し、
A1.dat,A2.dat,A3.dat,・・・というふうに新規にファイルを作っていく
プログラムを作りたいのですがどのように作ったらいいでしょうか?



No.2007

Re:ファイル分割プログラム
投稿者---RiSK(2004/06/14 12:50:30)


>A.datというファイルがあり
// とりあえずA.datを作り…
#include <stdio.h>
int main(void) {
  FILE * fp;
  int i;
  fp = fopen("A.dat", "w");
  for (i = 0; i < 1001; i++) fprintf(fp, "%d\n", i);
  fclose(fp);
  return 0;
}
>その中身を100行ずつ取り出し、
>A1.dat,A2.dat,A3.dat,・・・というふうに新規にファイルを作っていく
>プログラムを作りたいのですがどのように作ったらいいでしょうか?
// これにA.datを食わせる
#define READ_FILE "A.dat"
#define WRITE_FILE "A%u.dat"
#define LINE_MAX 100

#include <stdio.h>

int main(void)
{
  FILE * read_fp, * write_fp;
  unsigned file_num, line;
  char buf[BUFSIZ];
  int c;

  if ((read_fp = fopen(READ_FILE, "r")) == NULL) {
    return 1;
  }
  for (file_num = 1; !feof(read_fp); file_num++) {
    _snprintf(buf, sizeof(buf), WRITE_FILE, file_num);
    if ((write_fp = fopen(buf, "w")) == NULL) {
      break;
    }
    for (line = 0; line < LINE_MAX; ) {
      if ((c = fgetc(read_fp)) == EOF) {
        break;
      }
      if (c == '\n') {
        line++;
      }
      if (fputc(c, write_fp) == EOF) {
        break;
      }
    }
    fclose(write_fp);
  }
  fclose(read_fp);

  return 0;
}
結果:A1.datからA11.datまでを吐きました。ファイルの内容もあっているように見えます。

私がソースを書くと…
if (!bool) {
  // 失敗
  break;  // または return X;
  }

が多いですが、これは一般的なのでしょうか?
# 状況によるのでしょうけど…
もっとエレガントな(皆さんがそう思う)書き方があったら参考にしたいです。

ex.
・私は普段から〜を使います。
・今回の場合なら〜とします。


No.2008

Re:ファイル分割プログラム
投稿者---RiSK(2004/06/14 13:04:25)


失礼しました。
環境:Windows Me/Visual C++ 6.0
#if _MSC_VER == 1200  // VC6
#define snprintf _snprintf
#endif
を先頭に追加

    _snprintf(buf, sizeof(buf), WRITE_FILE, file_num);
    snprintf(buf, sizeof(buf), WRITE_FILE, file_num);
に訂正

また、エレガントな書き方は if〜break 以外の点でも募集します。


No.2009

Re:ファイル分割プログラム
投稿者---monkey(2004/06/14 13:37:38)


>また、エレガントな書き方は if〜break 以外の点でも募集します。

RiSKさん:
のんたんさんのご質問と直接関係のない話題ですので,別スレッドか,別の掲示板で提起されるのが妥当と存じます.


No.2014

Re:ファイル分割プログラム
投稿者---RiSK(2004/06/14 22:09:56)


>>また、エレガントな書き方は if〜break 以外の点でも募集します。
>
>RiSKさん:
>のんたんさんのご質問と直接関係のない話題ですので,別スレッドか,別の掲示板で提起されるのが妥当と存じます.

了解です。

いつも便乗質問で悪いなと思いながら、
ツリー形式なら枝分かれもして構わないのではないかとも考えている私。
掲示板利用は難しいです。

ちなみに「のんたんさんのご質問と直接関係のない話題」とは思いませんでした。
「別解あればうれしいな」は図々しいでしょうか?
# あっ、そういうことはいちいち書くことではなかったのか…な?



No.2017

Re:ファイル分割プログラム
投稿者---RiSK(2004/06/14 22:56:08)


>了解です。

No.2016 エラーチェック時の分岐の仕方に新しいスレッドを立てました。
よろしくお願いします。