ページ 11

ファイル入出力2.1

Posted: 2017年7月02日(日) 17:38
by Makoto
ファイルから1行ずつ読み込んで行番号を付けて表示するための取っ掛かりを教えて頂けませんか?以下、問題文です。
実行例のようにコマンド引数に指定したテキストファイルを開き,ファイルから1行ずつ読み込んで行番号を付けて表示するプログラムを作成しなさい.コマンド引数が指定されなかった場合には,エラーメッセージを表示してプログラムを停止させること.
保存場所はinfo1 ファイル名はexC3.c
実行例(info1内にテキストファイルexC23.cが置いてあるとする)
% cat exC23.c ← テキストファイル exC23.c の内容を確認
#include <stdio.h>
int main(void)
{
char a[] = "Sample Text";
printf("%s¥n", a);
return 0;
}
% ./exC3 exC23.c ← テキストファイル名 exC23.c をコマンド引数に指定してプログラム実行
1: #include <stdio.h>
2:
3: int main(void)
4: {
5: char a[] = "Sample Text";
6:
7: printf("%s¥n", a);
8:
9: return 0;
10: }
% ./exC3 ← テキストファイル名が指定されていないときには,エラーメッセージを表示
ファイル名を指定して下さい
%

コード:

#include <stdio.h>

int main(void)
{
  FILE *fopen(char *exC23.c, char *r); 

  int argc;
  char *argv[1];
  
  int main(void)
  {
    char a[]="Sample Text"; 
  
    printf("%s\n", a);

    return 0;
  }
}

Re: ファイル入出力2.1

Posted: 2017年7月02日(日) 18:16
by hide
取っ掛かりとしてはまず、動作させる環境をつくるところとかですかね。
前回に続いて動くプログラムになってないのですが、コンパイルとかしてないのでしょうか?
ちゃんと動かせる環境があるのならば、コンパイル時のエラーを読みましょう。
エラーの意味がわからなければ、エラーの内容をここで聞きましょうか。

Re: ファイル入出力2.1

Posted: 2017年7月02日(日) 18:18
by みけCAT
ファイルを読み込んでそのまま出力するプログラムです。

コード:

#include <stdio.h>

int main(int argc, char* argv[]) {
	FILE* fp;
	int input;
	if (argc < 2) {
		/* コマンド引数が指定されなかった場合 */
		fputs("エラーメッセージ\n", stderr);
		return 1;
	}
	/* ファイルを開く */
	fp = fopen(argv[1], "r");
	if (fp == NULL) {
		/* ファイルを開けなかった */
		fputs("ファイルオープンに失敗\n", stderr);
		return 1;
	}
	/* ファイルを読み込んで処理する */
	while ((input = getc(fp)) != EOF) {
		putchar(input);
	}
	fclose(fp);
	return 0;
}
行番号を付けるには、プログラム開始時または改行('\n')を読み込んだ後、次の文字を出力する前に行番号を出力する処理を追加すればいいでしょう。

Re: ファイル入出力2.1

Posted: 2017年7月02日(日) 23:32
by かずま
Makoto さんが書きました:

コード:

#include <stdio.h>

int main(void)
{
  FILE *fopen(char *exC23.c, char *r); 

  int argc;
  char *argv[1];
  
  int main(void)
  {
    char a[]="Sample Text"; 
  
    printf("%s\n", a);

    return 0;
  }
}
各行の意味を説明してください。
または、argv の意味が分かったはずだから、
プログラムを書き直してください。

Re: ファイル入出力2.1

Posted: 2017年7月05日(水) 09:09
by Makoto

コード:

#include <stdio.h>
 
int main(void)
{
  FILE *fopen(char *exC23.c, char *r);  //ファイルexC23.cを読み込み用に開く
 
  int argc; //argcは引数の数
  char *argv[1]; //argv[1]は1番目の引数文字列
  
  int main(void)
  {
    char a[]="Sample Text";  //文字型の配列aにSample Textを代入
  
    printf("%s\n", a);
 
    return 0;
  }
}
プログラムは書き直しても、うまくいきませんでした。

Re: ファイル入出力2.1

Posted: 2017年7月05日(水) 10:02
by purin52002
こんにちは

書き直したプログラムも張ってもらえると嬉しいです^^

今のままだと、以下の点が気にくわないです^p^

5行目:関数呼び出し時に変数宣言してる×2
7~8行目:main関数に引数はないけど引数の数とか文字列用の変数を宣言してる。(エラーではない)
10~17行目:main関数の中でmain関数を定義してる。(このmain関数はexC23.cに記述するべきでは?)

Re: ファイル入出力2.1

Posted: 2017年7月06日(木) 22:26
by Dixq (管理人)
これ書き直してないコードですよね?間違いの投稿?
書き直したコードを提示して頂ければと思います。
回答やら不足部分やら必要なことは既に上の人達が言っていますが・・。

とりあえずmain関数が2つ存在することはできません。
関数の中に関数があるのもダメです。

コード:

#include <stdio.h>
 
int main(int argc, char* argv[])
{
	//ここ
	return 0;

}
これが基本となりますので、「//ここ」に処理を追加していくことになります。
ほぼ答えは既にみけCAT君が書いていますが、分からないところを教えてください。