C言語関係掲示板

過去ログ

No844 2つのファイル内容が全く同じ物か別物かを調べるプログラム

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

2つのファイルの比較
投稿者---初心者(2003/11/29 08:24:23)


2つのファイル内容が全く同じ物か別物かを調べるプログラムはどう書けば良いのでしょうか?

比較的簡単なのか、かなり面倒なのかも分かりません。
ネット上を探しても有りそうで見つかりません。

どうかご存知のかたがみえましたら、具体的なコードでご教授ください。
一方的なお願いになって申し訳ありません。


No.10810

Re:2つのファイルの比較
投稿者---たか(2003/11/29 10:39:42)


>2つのファイル内容が全く同じ物か別物かを調べるプログラムはどう書けば良いのでしょうか?
>
>比較的簡単なのか、かなり面倒なのかも分かりません。
>ネット上を探しても有りそうで見つかりません。

二つのファイルを"rb"モードで開く。
一文字ずつ読んで比較する。
違いがあった時点で「違う」と出力して終了。
どちらかが先にEOFが来てしまった場合も「長さが違う」で終了。
両方同時にEOFが来たら「同一ファイルです」で終了。

No.10811

Re:2つのファイルの比較
投稿者---初心者(2003/11/29 14:16:32)


本当に申し訳ないのですが、お手元にそのコードがあれば
教えて頂けないでしょうか?

無理なようでしたらあきらめます。

No.10813

Re:2つのファイルの比較
投稿者---たか(2003/11/29 17:40:57)


常にバイナリモードで比較していますので、テキストファイルで長さの
違うものを比較しても、「短いです」の表示は出ません。

通常はバイナリとテキストの比較をスイッチで切り替えられるようにし
ておくと便利です。

使い方: diff file1 file2
(このプログラムをfile.cとして保存しコンパイル)

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

int main(int ac, char *av[])
{
  FILE *fi1, *fi2;
  int c, d;
  
  if (ac != 3) {
    printf("使い方: diff file1 file2\n");
    exit(1);
  }

  if ((fi1 = fopen(av[1], "rb")) == NULL) {
    printf("ファイル '%s' が見つかりません。\n", av[1]);
    exit(1);
  }
  if ((fi2 = fopen(av[2], "rb")) == NULL) {
    printf("ファイル '%s' が見つかりません。\n", av[2]);
    exit(1);
  }

  while (1) {
    c = fgetc(fi1);
    d = fgetc(fi2);
    if (c == EOF && d == EOF) break;
    if (c == EOF && d != EOF) {
      printf("ファイル '%s' の方が短いです。\n", av[1]);
      exit(1);
    } else if (c != EOF && d == EOF) {
      printf("ファイル '%s' の方が短いです。\n", av[2]);
      exit(1);
    } else if (c != d) {
      printf("ファイル '%s' と ファイル '%s' は違います。\n", av[1], av[2]);
      exit(1);
    }
  }
  
  printf("ファイル '%s' と ファイル '%s' は同一です。\n", av[1], av[2]);
  
  fclose(fi1);
  fclose(fi2);
  
  return 0;
}


No.10814

Re:2つのファイルの比較
投稿者---たか(2003/11/29 17:41:58)


×(このプログラムをfile.cとして保存しコンパイル)
○(このプログラムをdiff.cとして保存しコンパイル)

No.10816

Re:2つのファイルの比較
投稿者---初心者(2003/11/29 19:37:28)


たか様 本当にありがとうございました。

>常にバイナリモードで比較していますので、テキストファイルで長さの
>違うものを比較しても、「短いです」の表示は出ません。

ということはバイナリでは長くてもテキストファイルだと短いということが
有るということでしょうか?

この辺のことも良く分かっていないので教えていただきたいです。

No.10818

Re:2つのファイルの比較
投稿者---たか(2003/11/29 20:43:57)


>>常にバイナリモードで比較していますので、テキストファイルで長さの
>>違うものを比較しても、「短いです」の表示は出ません。
>
>ということはバイナリでは長くてもテキストファイルだと短いということが
>有るということでしょうか?

そうではなく、テキストファイルは各行の終わりに'\n' == LF(改行)
コードがついています。最後の行に限って付けない事もできますが、話を
簡単にするためにLFコードは全部ついているものとしましょう。

すると、テキストファイルを二つ比較中、LFコードとそうでないコード
を比較すると、それだけで「二つのファイルは違う」と判断してしまう
のです。本当はLFの次に出るはずのEOFを読み取って「短い」としたい所
ですね。

だからテキスト比較はできれば行末のLFコードを取り除いてやりたい。
そうすれば短いかどうか判断できます。

No.10819

Re:2つのファイルの比較
投稿者---たか(2003/11/29 20:48:19)


ちなみにWindowsはMS-DOSの流れを組んで、CR-LF、0x0d0aが行末について
います。"r"で読み取ると0x0aだけになりますが、"rb"で読み取ると
0x0d0aが読み込まれます。

No.10821

解決
投稿者---初心者(2003/11/29 21:23:27)


何度もありがとうございました。
大変良く分かりました。