←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3663

fgets が異常な動作をする
投稿者---横田 祐(2005/04/18 22:39:02)


はじめまして.
Win2k sp4でボーランドCコンパイラ5.5.1で作ったプログラムを動かしたら,
おかしな事が起こりました.
大きなテキストファイルの内容を,fgets関数を使って,取り込もうとするとfgets関数の動きがおかしくなります.



下記のC言語プログラムを用いて,26.2 MBのテキストファイル(allreg.reg)に対して処理すると,
出力は「乗の情報および」だけでした.
このテキストファイルの中には「乗の情報および」という文字列は全く含まれていません.
色々なサイズのテキストファイルに対して同様の処理を加えたところ,
サイズが900KBを超えると出力の量が400KB程度になることがありました.
ただ,900KBを超えれば必ず出力が小さくなるわけでなく,
2MBを超えても出力の量は2MBのままのときもありました.
これらのテキストファイルは全て改行コードが入っていて,
各行はstr[1024] に収まります.
このままでは使い物にならないので,解決策を教えてください.お願いします.
コンパイル時はオプションを付けずに「bcc32 test.txt」(test.txtはソースコード)
と打ちました.


int main( void )
{
    FILE *fp;
    char str[1024];

    fp = fopen( "allreg.reg", "r" );
    while( NULL != fgets( str, sizeof(str), fp ) )
    {
        printf( str );
    }
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fgets が異常な動作をする 3665 Blue 2005/04/18 23:15:39
<子記事> Re:fgets が異常な動作をする 3666 NykR 2005/04/19 00:23:36
<子記事> Re:fgets が異常な動作をする 3667 nop 2005/04/19 11:27:00
<子記事> Re:fgets が異常な動作をする 3672 れいじ 2005/04/20 22:49:44


No.3665

Re:fgets が異常な動作をする
投稿者---Blue(2005/04/18 23:15:39)


解答ではないですが
>コンパイル時はオプションを付けずに「bcc32 test.txt」(test.txtはソースコード)
>と打ちました.
C言語(またはC++)のソースファイルの拡張子を .txt にするのはどうかと思います。
C言語ならば .c C++ならば .cpp といったようにしたほうがよろしかと。




この投稿にコメントする

削除パスワード

No.3669

Re:fgets が異常な動作をする
投稿者---横田 祐(2005/04/19 22:31:18)


返信ありがとうございます.
>C言語ならば .c C++ならば .cpp といったようにしたほうがよろしかと。
そうします.


この投稿にコメントする

削除パスワード

No.3666

Re:fgets が異常な動作をする
投稿者---NykR(2005/04/19 00:23:36)


> printf( str );

printfは第一引数を書式文字列として取り扱います。
ですから呼び出し側も普通は

printf("%s", str);

の様に書きます。
# 直に書くと、strに'%'が含まれていた場合に困ったことになります(確か未定義動作)。

# fgetsで取得した文字列をそのまま出力するなら、
# fputsの方が自然かもしれませんが。


この投稿にコメントする

削除パスワード

No.3670

Re:fgets が異常な動作をする
投稿者---横田 祐(2005/04/19 22:35:11)


書き込みありがとうございます.
>> printf( str );
>
>printfは第一引数を書式文字列として取り扱います。
>ですから呼び出し側も普通は
>
>printf("%s", str);
>
>の様に書きます。
># 直に書くと、strに'%'が含まれていた場合に困ったことになります(確か未定義動作)。
>
># fgetsで取得した文字列をそのまま出力するなら、
># fputsの方が自然かもしれませんが。
この場合はfputsを使った方が良いですね.以後気をつけます.


この投稿にコメントする

削除パスワード

No.3667

Re:fgets が異常な動作をする
投稿者---nop(2005/04/19 11:27:00)


見える動作のみを見て、「fgets()がおかしい」と言うのは、
プログラムを行う者として良くないのではないでしょうか?

そもそも、プログラムはあなたが意図した通りには動いてないかもしれませんが、
あなたが書いた通りには動作しています。

つまり、「fgets()」を疑う前に、
まず、あなたが書いたコードを疑うべきではないでしょうか?


この投稿にコメントする

削除パスワード

No.3668

Re:fgets が異常な動作をする
投稿者---横田 祐(2005/04/19 22:29:25)


その通りだと思います.わざわざ書き込んで戴いたのは
大変ありがたいです.

>見える動作のみを見て、「fgets()がおかしい」と言うのは、
>プログラムを行う者として良くないのではないでしょうか?
>
>そもそも、プログラムはあなたが意図した通りには動いてないかもしれませんが、
>あなたが書いた通りには動作しています。
>
>つまり、「fgets()」を疑う前に、
>まず、あなたが書いたコードを疑うべきではないでしょうか?


この投稿にコメントする

削除パスワード

No.3671

Re:fgets が異常な動作をする
投稿者---ぽこ(2005/04/20 00:57:01)


おかしな現象が出ないファイルと出るファイルの
差(文字コードや、日本語の有無など)は何でしょうか?

少なくとファイルサイズが原因ではなさそうなので、
いろいろな観点からテストを重ねることをお勧めします。

#コード自体はそれほど問題があるようには見えません。



この投稿にコメントする

削除パスワード

No.3672

Re:fgets が異常な動作をする
投稿者---れいじ(2005/04/20 22:49:44)


まずは基本的なことを習得したほうがいいと思います。
printf(str)→printf("%s\n",str)にするとか、fopen関数を使用後は、returnの前でfclose(fp)をするとか・・・!

それが直れば特にソースには問題ないと思います。
これ以上はテストデータを見てみないとなんともいえません。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity