C言語関係掲示板

過去ログ

No.935 1行サイズ未満でfgetsを使うと

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

2ファイルから読み込んだ文字列の結合
投稿者---takahasi(2004/01/16 20:29:18)


一行16文字の[TEXT1.txt]から11文字だけ読み取り、一行5文字の[TEXT2.txt]と結合し
下記のような16文字の[TEXT3.txt]に出力するプログラムを作成したのですが、
どうもうまく動きません。

[TEXT1.txt]:入力ファイル
0000000000000000
1111111111111111
以下続く...

[TEXT2.txt]:入力ファイル
11111
22222
以下続く...

[TEXT3.txt]:出力例
0000000000011111
1111111111112222
以下続く...

どこを直したらいいのでしょうか?
アドバイスをお願いします。

作成環境はCPad for Borland C++Compilerを使用しています。

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

int main(void)
{
    char buff[16],buff1[11],buff2[5];

    gets(buff1);
    gets(buff2);

    FILE *infile1;
    FILE *infile2;
    FILE *outfile;

    /* txt入出力処理------------------------------ */
    if ((infile1=fopen("text1.txt","r"))==NULL){
        printf("ファイルをオープンできません\n");
        exit(1);
    }
    if ((infile2=fopen("text2.txt","r"))==NULL){
        printf("ファイルをオープンできません\n");
        exit(1);
    }
    if ((outfile=fopen("text3.txt","wt"))==NULL){
        printf("ファイルをオープンできません\n");
        exit(1);
    }
    /* 文字列結合処理------------------------------ */
    while(fgets(buff1, 12, infile1) != NULL)
    {
        fgets(buff2, 6, infile2);

        strcpy(buff, buff1);
        strcat(buff, buff2);

        fprintf(outfile,"%s\n",buff);
    }

    fclose(infile1);
    fclose(infile2);
    fclose(outfile);

    return(0);
}


No.11874

Re:2ファイルから読み込んだ文字列の結合
投稿者---かずま(2004/01/16 21:22:35)


    char buff1[256], buff2[256];

    while (fgets(buff1, sizeof buff1, infile1) &&
           fgets(buff2, sizeof buff2, infile2))
        fprintf(outfile, "%.11s%.5s\n", buff1, buff2);
なぜ、これでよくて、元のがだめなのか分かりますか?

No.11886

Re:2ファイルから読み込んだ文字列の結合
投稿者---takahasi(2004/01/17 16:07:32)


返信遅くなりましたすいません。
大変参考になりました。ありがとうございます。

>fgets(buff1, sizeof buff1, infile1
(fgets(buff1, 12, infile1)の表記は指定文字数を指定せずに、
sizeofを用いるべきなんですね。

>fprintf(outfile, "%.11s%.5s\n", buff1, buff2);
結合もこうすれば、簡単にできますね。
考えが回らなかったです。

まだ勉強したてなので、これからプログラムと睨めっこしていきたいと思います。

No.11888

Re:2ファイルから読み込んだ文字列の結合
投稿者---YuO(2004/01/17 17:03:19)


>>fgets(buff1, sizeof buff1, infile1
>(fgets(buff1, 12, infile1)の表記は指定文字数を指定せずに、
>sizeofを用いるべきなんですね。

違いますよ。

元の表記では,11文字までしか読み込みません。
その行が11文字以上からなっていれば,残りは次のfgets呼び出しで読み出されます。
#元々のプログラムだとbuffer overrunを引き起こしていますが……。

かずまさんのプログラムでは,最大255文字まで読み込みます。
行あたり255文字以上からなっている場合は,次のfgets呼び出しで残りが読み出されてしまいますが,
最初の指定で一行16文字とのことなので,それは問題ないでしょう。