掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板2

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

No.27162

行数を表示するプログラム
投稿者---ハコネ(2006/06/12 11:44:52)


C初めて一週間のものです。どうぞよろしくおねがいします。

指定したファイルを読み込みステップ数(行数)を表示するプログラムを作成する。
尚、ファイルはWindowsプラットフォームのテキストファイルであるとする。
というような問題を出されたのですがコンパイルしたときに改行のCRが消えてしまいます。
また、エディタで改行コードLFで保存したテキストを↓のソースで読み込むと見た目一行
でもしっかり○○行と出てしまい、やりなおしを食らいました。
ここ数日調べてわからなかったので分かる人いたら教えてくださいorz
#include<stdio.h>
#include<stdlib.h>

int main(void){
unsigned char C;
int i=0;
int cnt=0;
char FileName[256]; /*ファイル名は255文字まで*/
FILE *fp;

printf("入力ファイル名を入力してください>>>");
gets(FileName);

/*エラー処理*/
if((fp=fopen(FileName,"r"))==NULL){
printf("ファイルが見つかりません---%s\n",FileName);
exit(1);
}
/*ファイルの読み*/
while(!feof(fp))
{
C=fgetc(fp);
if(C==10){
cnt=cnt+1;
}
}
printf("入力されたファイルの行数は%d行です", cnt); /*行数の表示*/
fclose(fp);
return(0);
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:行数を表示するプログラム 27163 Blue 2006/06/12 11:50:04
<子記事> Re:行数を表示するプログラム 27165 nop 2006/06/12 12:34:55


No.27163

Re:行数を表示するプログラム
投稿者---Blue(2006/06/12 11:50:04)


> 改行のCRが消えてしまいます。
テキストモードで読み込むと消えるような仕様になっていたような。

"r" ではなく、 "rb" として fopenしてみてはどうでしょうか?


この投稿にコメントする

削除パスワード

No.27164

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/12 12:02:55)


あ。。。
できました。
Blueさんお早い返事ありがとうございました!


この投稿にコメントする

削除パスワード

No.27165

Re:行数を表示するプログラム
投稿者---nop(2006/06/12 12:34:55)


>if(C==10){

Cにおける改行文字は'\n'です。


この投稿にコメントする

削除パスワード

No.27170

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/12 15:56:55)


>if(C==10){

>Cにおける改行文字は'\n'です。

おお、すみません、今直しました。
ありがとうございます(^_^)


この投稿にコメントする

削除パスワード

No.27187

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/13 11:47:51)


昨日、指摘されたところを直して以下のソースを提出しました。
ですがこのソースだと改行の数を計算するもので正確な行数を表示できず、再度やりなおしを食らいましたorz
whileの中にフラグを入れてみたりもしたのですが正確な行数は表示されず…。
どうしたらいいのでしょうか?
#include<stdio.h>
#include<stdlib.h>

int main(void){
unsigned char C;
int i=0;
int j=0;
int k=0;
int cnt=0;
char FileName[256]; /*ファイル名は255文字まで*/
FILE *fp;

printf("桁数表示するファイル名を入力してください>>>");
gets(FileName);

/*エラー処理*/
if((fp=fopen(FileName,"rb"))==NULL){
printf("ファイルが見つかりません---%s\n",FileName);
exit(1);
}

/*CR,LF,CRLFの判定。CR及びLFは一行となる*/
while(!feof(fp))
{
C=fgetc(fp);
if(j==0){
cnt=cnt+1;
j=1;
}
if(C=='\n'){
if(i==1){
i=0;
j=0;
}else{
cnt=1;
break;
}
}else if(i==1){
cnt=1;
break;
}
if(C=='\r'){
i=1;
}
}

/*行数の表示*/
printf("入力されたファイルの行数は%d行です", cnt);
fclose(fp);
return(0);
}


この投稿にコメントする

削除パスワード

No.27189

Re:行数を表示するプログラム
投稿者---acid(2006/06/13 12:16:03)


どういう状況で正確な行数が表示されないのでしょうか?
今ちょっと実行してみましたが、行数でましたよ。
少なくとも、EOFファイルのみ、最終行がEOFのみ、普通の場合では
OKでしたが…


この投稿にコメントする

削除パスワード

No.27194

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/13 13:12:32)


>どういう状況で正確な行数が表示されないのでしょうか?

分かりにくくてごめんなさい。
最終行がEOFのみの場合に一行としてカウントしてしまうのですが、カウントしないためにはどのように組めばいいのでしょうか?


この投稿にコメントする

削除パスワード

No.27195

Re:行数を表示するプログラム
投稿者---acid(2006/06/13 14:00:39)


>最終行がEOFのみの場合に一行としてカウントしてしまうのですが、
それは別にテキスト的には一行でもいいような気もするが…
まぁステップ的には数えちゃまずいのか。

ちょー簡単な方法。
各行の文字数をカウントする変数を作って、文字数が0の時にEOFが来たら行数をインクリメントしないでブレイクする。
またはフラグを使って、改行の直後にEOFが来たらインクリメントしないでブレイク。
これらの例外処理をwhileの頭に持ってくればOK。
EOFの検出はまんま if(C==EOF) で出来ますので。


この投稿にコメントする

削除パスワード

No.27200

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/13 16:49:10)


ご指摘ありがとうございました。
言われたことを参考にし、直して再度提出したところなんとか合格をもらえました。
同じ問題で一週間かかっちゃったけどorz
本当にたすかりました(^_^)


この投稿にコメントする

削除パスワード

No.27205

Re:行数を表示するプログラム
投稿者---acid(2006/06/13 17:28:27)


おめでとうございます。
まぁ良かった良かった。


この投稿にコメントする

削除パスワード

No.27192

Re:行数を表示するプログラム
投稿者---nop(2006/06/13 12:44:54)


>どうしたらいいのでしょうか?

プログラムの基本は、

 その処理を自分自身が行う場合、どの様な手順で行うか?

を考えることです。
もし、あなた自身がその処理を行う場合、
どの様な手順で行うか、他人に詳しく説明できますか?
その手順を紙に書いたり、エディタで打ち込むなりしましたか?

その手順が明確にした後、個々の手順をCに翻訳すれば良いのです。


この投稿にコメントする

削除パスワード

No.27193

Re:行数を表示するプログラム
投稿者---REE(2006/06/13 12:50:05)


>昨日、指摘されたところを直して以下のソースを提出しました。
>ですがこのソースだと改行の数を計算するもので正確な行数を表示できず、再度やりなおしを食らいましたorz
>whileの中にフラグを入れてみたりもしたのですが正確な行数は表示されず…。
>どうしたらいいのでしょうか?

まず、そのフラグと思われる変数i,jの名前を意味が分かるものに変えましょう。
あと、cnt=1の処理がループ中にあるのは問題ありませんか?



この投稿にコメントする

削除パスワード

No.27197

Re:行数を表示するプログラム
投稿者---nop(2006/06/13 16:05:32)


>まず、そのフラグと思われる変数i,jの名前を意味が分かるものに変えましょう。
>あと、cnt=1の処理がループ中にあるのは問題ありませんか?

それ以前に、ファイルにデータがない場合、
必ずカウントされるように出来ている事が問題。

> int j=0;
> while(!feof(fp))
> {
>   C=fgetc(fp);
>   if(j==0){ /* データがない時は必ず真になる! */
>     cnt=cnt+1;



この投稿にコメントする

削除パスワード

No.27198

Re:行数を表示するプログラム
投稿者---nop(2006/06/13 16:07:05)


res元間違ってる…orz


この投稿にコメントする

削除パスワード

No.27215

Re:行数を表示するプログラム
投稿者---円零(2006/06/13 18:53:48)


>あと、cnt=1の処理がループ中にあるのは問題ありませんか?

思うに、

そのファイル中に単独で\rや\nが転がっていた場合、
そのファイルの改行は全てCRのみないしLFのみであると考えられる。
故に、Windows的に言えばそのファイルは1行だ。数えるまでもない。

という考えなのではないかと。
あまり良い仕様ではない気がしますが。




この投稿にコメントする

削除パスワード

No.27220

Re:行数を表示するプログラム
投稿者---ハコネ(2006/06/14 09:11:59)


>故に、Windows的に言えばそのファイルは1行だ。数えるまでもない。
>という考えなのではないかと。

はい、実はその点は講師の方に指摘を受けましてやり直しました。
最終的にはCR,LF,CR+LF全てが混ざっていてもCR+LFの個数だけを
取り出せる仕様に致しました。
見苦しいソースですみませんでしたorz




この投稿にコメントする

削除パスワード

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