質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

二つのファイルを読み込み、比較するプログラミング作ったが、正しい結果が得られませんでした。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 698
コード

#include <stdio.h>
#include <ctype.h>

int stricomp(const char str1[], const char str2[]){

 int i, count1 = 0, count2 = 0, a;

 while(str1[count1])
    count1++;
 while(str2[count2])
    count2++;

 printf("%d\n%d\n",count1,count2);

 if( count1 != count2)
  return 0;

 for( i = 0; i < count1; i++){
  if( tolower( str1[i] ) != tolower( str2[i] ))
    return 0;
  }

  return 1;
 }


 int main(void){
  char str1[100], str2[100], file1[10], file2[10];

 printf("ファイル1を入力してください:");
  scanf("%s", file1);

 printf("ファイル2を入力してください:");
  scanf("%s", file2);

 FILE *fp1,*fp2;

 if((fp1 = fopen( file1, "r"))!=NULL){
        while( fgets(str1,100,fp1) != NULL ){
            printf("%s",str1);
        }
    }

  if((fp2 = fopen( file2, "r"))!=NULL){
        while( fgets(str2,100,fp2) != NULL ){
            printf("%s",str2);
        }
    }

 fclose( fp1);
 fclose( fp2);

 printf("比較した結果は%d\n",stricomp( str1, str2));

 return 0;
}

このように、二つのファイルを読み込み、文字列に代入し、その文字列を比較するプログラムを作ったが、正しい結果を得られませんでした。(文字列比較する関数を自分で作る課題です。)

実行結果

1)

include <stdio.h>

int main(void){
printf("Hello, World 2014\n");

return 0;
}

include <stdio.h>

int main(void){
printf("Hello, World 2014\n");

return 0;
}
2        //count1
2        //count2 
比較した結果は1

2)

include <stdio.h>

int main(void){
printf("Hello, World 2014\n");

return 0;
}

include <stdio.h>

int main(void){
printf("Hello, World 2013\n");

return 0;
}
2    //count1
2    //count2
比較した結果は1

このように、countを数えるときはうまくいけませんでした。ちなみに、文字列だけの比較なら、このstricomp関数でうまくいけました。

教えてくださいm_m
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

まずファイル読込ループによりstr1,str2には各入力ファイルの最終行の(改行も含めた)文字列が格納されます。
また、おそらく入力ファイルの最終行は改行のみが含まれていると思われます。
その場合、比較処理ではstricomp( "\r\n", "\r\n")を行っていることになるため、どちらも文字数は2で一致と判定されます。

複数行あるファイル内容を比較するには

  • 2ファイルの読込を同時に行い、各行毎に比較するか(ループ処理がやや複雑になります)
  • いったんstd::vector<std::string>などの配列に行毎に格納した後に行毎に比較するか(こちらの方が処理は簡潔に書けます)

のように処理を修正する必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 13:09

    #include <stdio.h>
    #include <ctype.h>

    int stricomp(const char str1[], const char str2[]){

    int i, count1 = 0, count2 = 0;

    while(str1[count1])
    count1++;
    while(str2[count2])
    count2++;

    printf("%d\n%d\n",count1,count2);

    if( count1 != count2)
    return 0;

    for( i = 0; i < count1; i++){
    if( tolower( str1[i] ) != tolower( str2[i] ))
    return 0;
    }

    return 1;
    }


    int main(void){
    char str1[100], str2[100], file1[100], file2[100];
    int i, j;

    printf("ファイル1を入力してください:");
    scanf("%s", file1);

    printf("ファイル2を入力してください:");
    scanf("%s", file2);

    FILE *fp1,*fp2;

    j=0;
    if((fp1 = fopen( file1, "r")) != NULL){

    while( fgets(str1,100,fp1) != NULL ){

    for(i=0;str1[i];i++){
    file1[j]=str1[i];
    j++;
    }
    }
    }

    for(i=0;file1[i];i++)
    printf("%c",file1[i]);


    j=0;
    if((fp2 = fopen( file2, "r")) != NULL){

    while( fgets(str2,100,fp2) != NULL ){

    for(i=0;str2[i];i++){
    file2[j]=str2[i];
    j++;
    }
    }
    }

    for(i=0;file2[i];i++)
    printf("%c",file2[i]);

    fclose( fp1);
    fclose( fp2);

    if(stricomp( file1, file2)==0)
    printf("比較した結果は%d,不一致。\n",stricomp( file1, file2));
    else
    printf("比較した結果は%d,一致。\n",stricomp( file1, file2));

    return 0;
    }


    このように改良しましたが、得た結果は、

    #include <stdio.h>

    int main(void){
    printf("Hello, World 2014\n");

    return 0;
    }
    #include <stdio.h>

    int main(void){
    printf("Hello, World 2014\n");

    return 0;
    }
    @82
    83
    82
    83


    なぜか@が出できました。。。

    キャンセル

  • 2017/12/18 13:20 編集

    file1,file2に全データ読込むことを意図した修正と思われます。
    提示コードでは、どちらも末尾にナル文字('\0')が存在しないため、正しく文字列として扱えていないのが原因と思われます。
    ループの終わりにfile1[j] = '\0';とするか、ループ毎に素直にstrcatで文字列連結することでとりあえず回避できそうですが、データが100文字以上だと破綻しますので、あまり良い修正手段ではないと考えます。

    キャンセル

0

ひょっとして...fgetsでファイル読むと読んだ文字列がだらだら連結されると思ってる? 違うよ?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    ファイルから読み込み集計する方法

    A:100 B:200 C:300 A:130 B:210 C:330 のようなファイルを読み込み合計を出力するにはどうしたらいいでしょうか? A:230 B:410 C

  • 解決済

    C言語のfor文if分について、解答をお願いします。

    前提・実現したいこと こんにちは、初めての質問です。 1************************ 2************************ 3**********

  • 受付中

    【C言語】冗長だと思う数字入力プログラムを改善したい

    以下のプログラムは3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力するというコードです。 C言語はあまり慣れていないので、以下のコードに冗長さを感じますが何か改

  • 解決済

    fgets関数を用いた文字列の判定

    fgets関数を利用して文字列を入力し、その文字列に含まれている最初のaが何番目にあるのかを判定したいのですが、実行すると入力を3回させられ、3回目に入力した文字列で結果が判定

  • 解決済

    シーザー暗号についての問題

    シーザー暗号についての質問です 大文字を3字ずらす小文字を5字ずらすというプログラムを作っています。 ぶち当たった壁が大文字は3字ずらすことは可能なのですが小文字を5字ずらすことが

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

    メモ帳などの記録をプログラムで取り込み表示する方法

    表計算で作成したデータを、画面上に表形式で表示するプログラムを作成したいのですが データを読み込むのはどうすればよいのでしょうか?  例など教えてもらえると助かります。 inc

  • 解決済

    C言語でファイルを読み込み、一部の要素を取り出すコードのエラー

    前提・実現したいこと c言語でテキストファイルを読み込み、行としてではなく、各要素を読み込んで3列目と4列目だけ出力しようとしています。以下がコード作成のために参考にしているサイト

同じタグがついた質問を見る

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • トップ
  • C++に関する質問
  • 二つのファイルを読み込み、比較するプログラミング作ったが、正しい結果が得られませんでした。