課題です。。

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

課題です。。

#1

投稿記事 by もも » 18年前

コマンドラインからファイル名を読み込みそのファイルの行数を数えるプログラムを作りたいんですが、教えてください。

box

Re:課題です。。

#2

投稿記事 by box » 18年前

> コマンドラインからファイル名を読み込みそのファイルの行数を数えるプログラムを作りたいんですが、教えてください。

そのプログラムは、ざっと以下の要素に分解できそうです。

1)行数の値を初期化する。
2)読み込むファイルの名前をコマンドラインから受け取る。
3)読み込むファイルをオープンする。
4)ファイルの中身を読み、行数を数える。
5)数えた行数の値を出力する。
6)読み込みに使ったファイルをクローズする。

上記のどこが理解できていて、どこが理解できていないですか?

もも

Re:課題です。。

#3

投稿記事 by もも » 18年前

お返事誠にありがとうございます。
えっと、実は全部ぴんとこないんです、でも少し自分で考えてみてまたここにきてみます。

管理人

Re:課題です。。

#4

投稿記事 by 管理人 » 18年前

ももさん、素晴らしい姿勢ですね^^

上記手順でつまったらとりあえずgoogleで、可能なかぎり調べてみてください。
たいていの事は8000台のgoogleの端末が解決してくれます♪

もも

Re:課題です。。

#5

投稿記事 by もも » 18年前

ファイルのオープンといいますと、こんなのしか思い浮かばないんです。。
すみません、何度も・・・もし全然的外れでしたら悪いので返信下さらなくてもいいんですが、お時間あれば
お願いします。

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

int main(void)
{
FILE*fin;
char buf[256];
char filename1[/url]="rep1.txt";

if((fin = fopren(filename1,"r")) == NULL){
printf("%sをオープンできません.\n",filename1);
exit(1);
}

while (fgets(buf,256,fin) !=NULL){
printf("%s",buf);
}

keichan

Re:課題です。。

#6

投稿記事 by keichan » 18年前

ファイルオープンに関してはそれで概ね問題ないように見えます。
後は行数をカウントする処理を書いて、最後にファイルを使い終わったら
fclose(fin);
すれば期待する動作をするプログラムが完成すると思います。

box

Re:課題です。。

#7

投稿記事 by box » 18年前

さて、肝心の「行数を数える」です。
いったん、プログラムから離れて考えてみましょう。

エディタか何かでテキストファイルを開いているとき、
そのファイルの行数を確認するにはどういう方法があるでしょうか。
ある行と次の行とを区切っているのは何でしょう?

むつ

Re:課題です。。

#8

投稿記事 by むつ » 18年前

気になった点とヒントをいくつか。

・#define CRLF '??'
 ??を改行文字に置き換えてみる。
 なぜCRLFとしたかは、余裕がある時に調べてもらえればいいです。

・int main(void) -> int main(コマンドライン引数)
 このvoidの所でコマンドラインからファイル名を取得します。

・char buf[256] -> unsigned int buf;
 注意:あくまでも、ファイルの行数をカウントするだけで、
    内容の取得を意識していませんので。
    また、全角文字対策の為にint ではなくunsigned int を使用しました。

・int flcount = 0;
 ファイル内の行数値を初期化

・switch(コマンドライン引数の総個数)
 case 2:
 default:
 コマンドライン引数が誤りの場合の処理を追加

・if((fin = fopren() -> if((fin = fopen()

・while (fgets(buf,256,fin) !=NULL) -> while (fgets(fin) != ???)
 ???に当てはまるファイルの終端を表す文字は?
 また、この中でflcountをカウントアップ

・fclose(fin);

・printf("%s",buf); -> printf("%d", flcount);
 ファイルクローズした後に結果表示

・int mainとしたので、return( 0 ); を返しておきます。

管理人

Re:課題です。。

#9

投稿記事 by 管理人 » 18年前

ファイルをオープンして、ファイルから1行とってくるプログラムのサンプルがここにあります。

http://always-pg.com/c/runtime_rd/file/fgets.html

このループ内で、行数をカウントすればよいことがわかりますね。

このプログラムを参考に、また、上記の回答してくださった方々のご意見を参考に、やってみてください。

しっぽ

Re:課題です。。

#10

投稿記事 by しっぽ » 18年前

むつさんへ

私には分からない点が多々ありますので教えてくだされば幸いです。

---------------

>・#define CRLF '??'
> ??を改行文字に置き換えてみる。
> なぜCRLFとしたかは、余裕がある時に調べてもらえればいいです。

「CRLF」とは 0XD 0XA のことですか。ウィンドウズのファイルをバイナリーモードで開くのなら
分かるのですが、アスキーモードで、う~む。何のことでしょう?


>・char buf[256] -> unsigned int buf;
> 注意:あくまでも、ファイルの行数をカウントするだけで、
>    内容の取得を意識していませんので。
>    また、全角文字対策の為にint ではなくunsigned int を使用しました。

"1\n" の場合、または "1\d\nあ\d\n" と書かれたファイルの場合、対策はほど遠いように
思います。


>・while (fgets(buf,256,fin) !=NULL) -> while (fgets(fin) != ???)
> ???に当てはまるファイルの終端を表す文字は?
> また、この中でflcountをカウントアップ

fgets(FILE *) というCの関数はありましたか?この関数が分からないので「???」も
何のことだかさっぱりです。


>・fclose(fin);
この課題では必須とは言えないでしょう。

むつ

Re:課題です。。

#11

投稿記事 by むつ » 18年前

>しっぽさん
質問者とは他の方ですよね。

改行コードをマクロ定義する際、当方はwindows環境を使用しているので、
CRLFという記号定数にしました。という事です。

fgetc()の間違いでした。
とはいえ、どうしてもコレを使う訳ではないので。

"1\d\nあ\d\n" とありますが、
読み込むファイルとはCソースという事でしょうか。
当方は、以下のようなデータファイルを想定していました。
++ fcount.c ++
#include <stdio.h>
#define CRLF '\n'

int main( int argc, char *argv[/url])
{
	FILE *fp;
	unsigned int c;
	int nl   = 0;
	switch( argc ) {
	case 2:
		if(( fp = fopen(argv[1], "r") ) == NULL ) {
			printf( "ファイル名(%s)が誤りです。\n", argv[1] );
			return( 2 );
		}
		break;
	default:
		printf( "引数が誤りです。\n" );
		return( 2 );
	}
	while( ( c = fgetc( fp ) ) != EOF )
		if( c == CRLF ) nl++;
	if( argc == 2 ) fclose( fp );
	printf( "行数= %d\n", nl );
	return( 0 );
}
++ estimate.dat ++
材料A	200,000
材料B	150,000
工賃	50,000

しっぽ

Re:課題です。。

#12

投稿記事 by しっぽ » 18年前

>>しっぽさん
>質問者とは他の方ですよね。

全くの別人です。申し訳ないですが、今日は帰りが遅かったので
明日読ませてください。

しっぽ

Re:課題です。。

#13

投稿記事 by しっぽ » 18年前

>#define CRLF '\n'

私の頭の中では「キャレジリターン・ラインフィールド」= 0X0D0A と
なってしまっているので、へんだなと思い尋ねてみました。


>fgetc()の間違いでした。

なので残りの2つの疑問も解消です。

閉鎖

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