ページ 11

fgets とコマンドパラメータ

Posted: 2014年6月25日(水) 12:14
by 柿丘
コマンドパラメータからファイルを読み込み行数とともに出力しようとしているのですが、
一行余分に行数が出てしまいます。原因を教えていただけないでしょうか。
よろしくお願いします。

コード:

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

int main(int argc, char *argv[])
{
    FILE *fp;          /* ファイル読み込み用ポインタ変数 */
    char input[256];   /* ファイル内容出力用文字変数 */
    int line = 0;      /* 行数カウント用変数 */

    ~略(エラー処理)~

    /* ファイルオープン */
    printf("***** File Name:%s *****\n", argv[1]);
    printf("%04d:", line+1);
    while (fgets(input, sizeof(input), fp) != NULL) {
        printf("%s", input);
        if(input[strlen(input) - 1] == '\n') {
            line++;
            printf("%04d:", line+1);
            memset(input, '\0', sizeof(input));
        }
    }

    /* ファイルクローズ */
    fclose(fp);

    return(0);
}
実行
./test.out testfile.txt
0001:aaaaa
0002:bbbbb
0003:

コンパイラ gcc

Re: fgets とコマンドパラメータ

Posted: 2014年6月25日(水) 12:31
by box
fgets()
を使って読み込んだデータの末尾には
'\n'
を含んでいる、
ということに関係がありそうな気がします。

Re: fgets とコマンドパラメータ

Posted: 2014年6月25日(水) 12:50
by box
あるいは、読み込み用のファイルの最後に
改行だけの行
が存在しているとか…。

Re: fgets とコマンドパラメータ

Posted: 2014年6月25日(水) 13:21
by usao
テキストファイルの中身が
aaaaa改行
bbbbb改行
みたくなってるとか…

fgets() 後の input[] の中身を
http://hitorilife.com/fgets.php
みたいに数値として表示してみる等してみてはいかがでしょう?

Re: fgets とコマンドパラメータ

Posted: 2014年6月25日(水) 18:55
by 柿丘
皆さんありがとうございました!
解決しました。

Re: fgets とコマンドパラメータ

Posted: 2014年6月26日(木) 06:11
by かずま
柿丘 さんが書きました:皆さんありがとうございました!
解決しました。
解決したのなら、どうやって解決したのかを書いてください。
柿丘 さんが書きました:コマンドパラメータからファイルを読み込み行数とともに出力しようとしているのですが、
一行余分に行数が出てしまいます。原因を教えていただけないでしょうか。
よろしくお願いします。
データが間違っているのではないかという指摘がされていますが、
そうではありません。

単にプログラムがそうなっているからです。

まず、1行目を読む前に "00001:" を出力します。
1行目を読むと "aaaaa\n00002:" を出力します。
2行目を読むと "bbbbb\n00003:" を出力します。

プログラムは書いた通りに動きます。

Re: fgets とコマンドパラメータ

Posted: 2014年6月26日(木) 09:40
by usao
>単にプログラムがそうなっているからです。
>
>まず、1行目を読む前に "00001:" を出力します。
>1行目を読むと "aaaaa\n00002:" を出力します。
>2行目を読むと "bbbbb\n00003:" を出力します。
>
>プログラムは書いた通りに動きます。

当方,VS2012(Pro) にて,以下のコードを実行してみましたがそのようにはなりません.
具体的には,

aaaaa改行
bbbbb

という内容のテキストを読ませた場合には
>\n00003:
は出力されません.

そのようなものが表示されるのは
>bbbbb改行
>みたくなってる
場合です.

コード:

int main( int argc, char **argv )
{
    char input[256];
    int line = 0;

    FILE *fp = fopen( "in.txt", "r" );

    printf("%04d:", line+1);
    while (fgets(input, sizeof(input), fp) != NULL) {
        printf("%s", input);
        if(input[strlen(input) - 1] == '\n') {
            line++;
            printf("%04d:", line+1);
            memset(input, '\0', sizeof(input));
        }
    }

    fclose( fp );

    //
    std::cout << "[end]" << std::endl;
    std::cin.ignore();
    return 0;
}