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

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

 詳しくはこちら


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

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


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

No.22237

ファイルの終わりの判断について
投稿者---のむら(2005/07/28 14:25:22)


ファイルの終わりまでループで繰返しを行っています。
ファイルの終わり(ファイル・エンド)が、最終行の一番最後について
おり、ファイル・エンドが存在するか判断し、ファイル・エンドを改行
に置き換えたいのですが。
以下の様にしてみました。

#include <stdio.h>

main(int argc,char *argv[])
{
    FILE *fp ;
    char buff[4096] ;

    fp = fopen(argv[1],"r") ;
    if (fp == NULL) {
        printf("file open error [%s]\n",argv[1]) ;
    }

    while(fgets(buff,sizeof(buff),fp) != NULL) {
        if (feof(fp) != 0) {
            buff[strlen(buff)+1] = 0x0A ;
        }
        printf("[%d],[%s]\n",strlen(buff),buff) ;
    }

    if(0 != fclose(fp)) {
        printf("file close error [%s]\n",argv[1]) ;
    }
}


また、実行時、ファイルを指定しないで動かすと、core dumped する
のですが、どこがいけないのでしょうか。
どうすればよいのですか。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの終わりの判断について 22241 REE 2005/07/28 14:48:24
<子記事> Re:ファイルの終わりの判断について 22347 tetrapod 2005/08/01 10:18:25
<子記事> Re:ファイルの終わりの判断について 22405 アンドロオイド 2005/08/03 23:35:41


No.22241

Re:ファイルの終わりの判断について
投稿者---REE(2005/07/28 14:48:24)


>また、実行時、ファイルを指定しないで動かすと、core dumped する
>のですが、どこがいけないのでしょうか。
>どうすればよいのですか。

コマンドラインで引数が指定されていない場合、argv[1]にアクセスしてはいけません(何が入っているかも保証されていません)
既にご存知かもしれませんが、引数の数は、argcで確認することが出来ます。



この投稿にコメントする

削除パスワード

No.22310

Re:ファイルの終わりの判断について
投稿者---TT414(2005/07/30 15:11:28)


>コマンドラインで引数が指定されていない場合、argv[1]にアクセスしてはいけません(何が入っているかも保証されていません)

違います、NULLが入っています。(ANSI C以降)


この投稿にコメントする

削除パスワード

No.22312

Re:ファイルの終わりの判断について
投稿者---YuO(2005/07/30 16:35:04)


>>コマンドラインで引数が指定されていない場合、argv[1]にアクセスしてはいけません(何が入っているかも保証されていません)
>違います、NULLが入っています。(ANSI C以降)

条件:argc > 0
ですね。

argcは非負なので,argv[1]へのアクセスは,未定義動作になる可能性があります。



この投稿にコメントする

削除パスワード

No.22311

Re:ファイルの終わりの判断について
投稿者---まきじ(2005/07/30 15:50:22)


TT414 さんが仰っている

>NULLが入っています。

については、X3010 の 5.1.2.2.1 にも、
「argv[argc] は、空ポインタでなければならない」と
記載されています。


この投稿にコメントする

削除パスワード

No.22346

Re:ファイルの終わりの判断について
投稿者---REE(2005/08/01 10:06:32)


>>NULLが入っています。
>
>については、X3010 の 5.1.2.2.1 にも、
>「argv[argc] は、空ポインタでなければならない」と
>記載されています。

そうでしたか、勉強になります。



この投稿にコメントする

削除パスワード

No.22347

Re:ファイルの終わりの判断について
投稿者---tetrapod(2005/08/01 10:18:25)


えっと、質問は「ファイル名を指定しないときエラーになるのは何故」だけですか?

>buff[strlen(buff)+1] = 0x0A ;
だけでは「文字列」の終端である \0 文字がなくなってしまいます。
単純に strcat(buff, "\n"); で良いでしょう。



この投稿にコメントする

削除パスワード

No.22378

Re:ファイルの終わりの判断について
投稿者---のむら(2005/08/03 02:08:32)


>えっと、質問は「ファイル名を指定しないときエラーになるのは何故」だけですか?
>

文字列の後にあるファイル・エンドを改行コードに変えたいです。
strcat関数で、後ろに追加するだけでいんですか。


この投稿にコメントする

削除パスワード

No.22379

Re:ファイルの終わりの判断について
投稿者---Blue(2005/08/03 02:23:01)


> 文字列の後にあるファイル・エンドを改行コードに変えたいです。
文字列の後ろには「ファイル・エンド」といわれる文字はありません。
よってそのまま追加すればいいです。

ちなみに
> > buff[strlen(buff)+1] = 0x0A ;
> だけでは「文字列」の終端である \0 文字がなくなってしまいます。
ではなくて、終端文字の次の位置に改行コードを入れてますね。
strcatを使わなければ、

int len = strlen( buff );
buff[ len ] = '\n';
buff[ len + 1 ] = '\0';

ですかね。



この投稿にコメントする

削除パスワード

No.22385

Re:ファイルの終わりの判断について
投稿者---shu(2005/08/03 08:39:14)


ループを抜けたところで、

if (buf[strlen( buf ) - 1] != '\n')
    putchar( '\n' );


とか。


この投稿にコメントする

削除パスワード

No.22398

Re:ファイルの終わりの判断について
投稿者---のむら(2005/08/03 19:40:38)


>strcat(buff, "\n");
とすると最後にゴミが入る(残る)見たいです。
この場合だと、「'」(シングルクォーテーション)が出ていました。

>buff[ len ] = '\n';
>buff[ len + 1 ] = '\0';
で行こうとしました。



この投稿にコメントする

削除パスワード

No.22401

Re:ファイルの終わりの判断について
投稿者---まきじ(2005/08/03 21:12:08)


>この場合だと、「'」(シングルクォーテーション)が出ていました。

>buff[strlen(buff)+1] = 0x0A ;

を、strcat(buff,"\n"); に変えれば良いと思います。


この投稿にコメントする

削除パスワード

No.22405

Re:ファイルの終わりの判断について
投稿者---アンドロオイド(2005/08/03 23:35:41)


ファイル入出力モードの意味がわかっていないようなので、
処理内容が意味不明です。

それから、もし処理が正しいとしても、EOFマーク(ファイルエンドという言葉は意味不明、独自用語ならきちんと説明すること)をつぶす、
要するに不完全なファイルを作ろうとするのはどういう意図が
あるの。


この投稿にコメントする

削除パスワード

No.22419

Re:ファイルの終わりの判断について
投稿者---のむら(2005/08/04 11:57:08)



>それから、もし処理が正しいとしても、EOFマーク(ファイルエンドという言葉は意味不明、独自用語ならきちんと説明すること)をつぶす、
>要するに不完全なファイルを作ろうとするのはどういう意図が
>あるの。

説明が曖昧で申し訳ありません。
不完全なファイルを作っているのでないです。
読み込んだファイルの文字列の最後にEOFマークがあり、その行の
処理でおかしな動きをするものですから(私の作りがおかしいのも
ありますが)別のもに置換えをしようと。



この投稿にコメントする

削除パスワード

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