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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

2回答

9180閲覧

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

Kuroiwa_haruka

総合スコア13

C++

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

0グッド

1クリップ

投稿2017/12/18 02:15

編集2017/12/18 02:18

C++

1コード 2 3#include <stdio.h> 4#include <ctype.h> 5 6int stricomp(const char str1[], const char str2[]){ 7 8 int i, count1 = 0, count2 = 0, a; 9 10 while(str1[count1]) 11 count1++; 12 while(str2[count2]) 13 count2++; 14 15 printf("%d\n%d\n",count1,count2); 16 17 if( count1 != count2) 18 return 0; 19 20 for( i = 0; i < count1; i++){ 21 if( tolower( str1[i] ) != tolower( str2[i] )) 22 return 0; 23 } 24 25 return 1; 26 } 27 28 29 int main(void){ 30 char str1[100], str2[100], file1[10], file2[10]; 31 32 printf("ファイル1を入力してください:"); 33 scanf("%s", file1); 34 35 printf("ファイル2を入力してください:"); 36 scanf("%s", file2); 37 38 FILE *fp1,*fp2; 39 40 if((fp1 = fopen( file1, "r"))!=NULL){ 41 while( fgets(str1,100,fp1) != NULL ){ 42 printf("%s",str1); 43 } 44 } 45 46 if((fp2 = fopen( file2, "r"))!=NULL){ 47 while( fgets(str2,100,fp2) != NULL ){ 48 printf("%s",str2); 49 } 50 } 51 52 fclose( fp1); 53 fclose( fp2); 54 55 printf("比較した結果は%d\n",stricomp( str1, str2)); 56 57 return 0; 58}

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

実行結果

 #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

 #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
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

投稿2017/12/18 02:41

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuroiwa_haruka

2017/12/18 04: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 なぜか@が出できました。。。
can110

2017/12/18 04:21 編集

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

0

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

投稿2017/12/18 03:03

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問