ファィルの入出力

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

ファィルの入出力

#1

投稿記事 by su- » 13年前

以下に示すように,任意の長さの文字列が数行に渡って記述されているファイルがあるものとする.このファイルの最長の文字列が記述されている行が何行目であるかとその文字数を答えるプログラムを作成せよ.

The technology of a home network system (HNS) allows
integration of several kinds of home appliances to provide
a user with value-added integrated services.
Development of the integrated HNS services requires
implementation of the appliance components (with APIs)
and the services, according to each home-network environment.
There are various implementation standards such as DLNA, ECHONET, OSGi
and Jini for the HNS applications.
Therefore, even if a developer can choose the optimal one,
it's very difficult to develop the integrated services by composing
a new HNS implementation.

っという問題です。


<実行結果>
Input file name:mojiretsu.dat
最長文字列は7行目の72文字です。


〆切が今日中で非常に焦っています。
教えてもらえませんか。
おねがいします。

su-

Re:ファィルの入出力

#2

投稿記事 by su- » 13年前

本当に申し訳ありません。
問題の丸投げはいけないって十分分かってるんですけど。。本当に焦っています。お願いします。助けてください。ごめんなさい。

box

Re:ファィルの入出力

#3

投稿記事 by box » 13年前

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

#define MAXBUF (256)

int main(void)
{
	char file[MAXBUF], s[MAXBUF], str[MAXBUF] = "\0";
	int n, maxline, maxlen;
	FILE *fp;
	
	printf("Input file name:"), scanf("%s", file);
	fp = fopen(file, "r");
	if (fp == NULL)
		fprintf(stderr, "file open error\n"), exit(1);
	for (maxline = n = 1; fgets(s, sizeof(s), fp) != NULL; n++) {
		if (strlen(s) > strlen(str)) {
			strcpy(str, s);
			maxline = n;
			maxlen  = strlen(s);
		}
	}
	printf("最長文字列は%d行目の%d文字です。\n", maxline, maxlen);
	fclose(fp);
	return 0;
}

管理人

Re:ファィルの入出力

#4

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

う、ほぼ同時に先取られてしまいましたw

文字の最大数は71じゃないですか?

管理人

Re:ファィルの入出力

#5

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

\nも含めると72ですが・・。

box

Re:ファィルの入出力

#6

投稿記事 by box » 13年前

入力ファイルの各行の末尾にある'\n'を文字数としてカウントしないバージョンです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXBUF (256)

int main(void)
{
	char file[MAXBUF], s[MAXBUF], str[MAXBUF] = "\0";
	int n, maxline, maxlen;
	FILE *fp;
	
	printf("Input file name:"), scanf("%s", file);
	fp = fopen(file, "r");
	if (fp == NULL)
		fprintf(stderr, "file open error\n"), exit(1);
	for (maxline = n = 1; fgets(s, sizeof(s), fp) != NULL; n++) {
		s[strlen(s)-1] = '\0';
		if (strlen(s) > strlen(str)) {
			strcpy(str, s);
			maxline = n;
			maxlen  = strlen(s);
		}
	}
	printf("最長文字列は%d行目の%d文字です。\n", maxline, maxlen);
	fclose(fp);
	return 0;
}

su-

Re:ファィルの入出力

#7

投稿記事 by su- » 13年前

本当にありがとうございます。
今は無理ですが、しっかり復習して、出直して来ます。
本当に無理を言ってごめんさい。
無礼者だと思わないでください。
失礼しました。

管理人

Re:ファィルの入出力

#8

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

su-さん、大丈夫ですよ^^
私も宿題の期限が迫って困ったこともありますしw

以下を読んで、必ずアリゴリズムを確認してくださいね。

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

int main(){
	FILE *fp;
	int n=0;
	char st='\0';

	fp = fopen("mojiretu.txt", "r");

	if (fp == NULL)
		return 1;

	while ((st = fgetc(fp)) != EOF){
		if(st=='\n')	
			n++;
	}

	printf("%d行\n",n);

	fclose(fp);
}

これを見て何をするプログラムだか、わかりますか?

もしわからなかったら以下の説明を読んで確認してください。

これは先ほどのプログラムをちょっといじって、

ファイルから読み取った文章が何行であるか調べるプログラムです。

以下のプログラムは上記と全く同じです。注釈でアルゴリズムを確認してください。


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

int main(){
	FILE *fp;//ファイルを扱うための変数を宣言。
	int n=0;//行数をカウントするための変数
	char st='\0';//読み取った1文字を格納するための変数

	fp = fopen("mojiretu.txt", "r");//ファイルの情報がある住所をfpに格納

	if (fp == NULL)//その住所が無効なら強制終了
		return 1;

/*
fgetc関数でファイルから1文字読み取って変数stにその1文字を格納
格納したstがファイルの終端を表すEOFだったらループを抜ける
一度処理が終わるとファイルポインタが1進む。
つまり次に処理をすると今読み取った次の文字ポインタがあわさる
*/
	while ((st = fgetc(fp)) != EOF){
		if(st=='\n')//読み取った1文字が改行コードなら
			n++;//行数カウントアップ
	}

	printf("%d行\n",n);

	fclose(fp);
}

使っていたmojiretu.datは拡張子がこのままでは使いにくいのでmojiretu.txtとしています。
ファイルの内容は同じものです。

わからない関数があれば、その関数名をグーグルで検索すればたいていすぐ説明が書いてあるサイトがみつかります。

このプログラムを参考に以下の問題をやってみましょう。

問題1:
 文章の中に「a」が何文字出てくるかカウントするプログラムを書きましょう。
問題2:
 7行目に「a」は何行出てくるかカウントするプログラムを書きましょう。

是非、回答を後日投稿してください☆

Re:ファィルの入出力

#9

投稿記事 by » 12年前

今、私、これ必死に考えてますよ★★
もーちょっと、時間くださいねぇー♪
頑張ってますから(笑)

閉鎖

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