fgets とコマンドパラメータ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
柿丘

fgets とコマンドパラメータ

#1

投稿記事 by 柿丘 » 11年前

コマンドパラメータからファイルを読み込み行数とともに出力しようとしているのですが、
一行余分に行数が出てしまいます。原因を教えていただけないでしょうか。
よろしくお願いします。

コード:

#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

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 11年前

fgets()
を使って読み込んだデータの末尾には
'\n'
を含んでいる、
ということに関係がありそうな気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

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

#3

投稿記事 by box » 11年前

あるいは、読み込み用のファイルの最後に
改行だけの行
が存在しているとか…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#4

投稿記事 by usao » 11年前

テキストファイルの中身が
aaaaa改行
bbbbb改行
みたくなってるとか…

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

柿丘

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

#5

投稿記事 by 柿丘 » 11年前

皆さんありがとうございました!
解決しました。

かずま

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

#6

投稿記事 by かずま » 11年前

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

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

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

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

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#7

投稿記事 by usao » 11年前

>単にプログラムがそうなっているからです。
>
>まず、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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る