ページ 11

ファイルの入出力について

Posted: 2013年10月06日(日) 01:19
by ライム
はじめまして。
引数としてファイル名を入力して、そのファイルの内容を出力するプログラムを作りたいのですが、このプログラムではファイル名を入れても、ファイルを開いてくれません。10行目が間違っていると思うのですが、どう書いたらいいのか分かりません。
アドバイスよろしくお願いします。
使っているのはC言語です。

コード:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]){
  FILE *fp;
  int i;
  char a[256];
  if(argc==1){
	printf("cerror");
	}
  fp = fopen("argv[1]","rt");
  if(NULL==fp){printf("Can not open %s\n",argv[1]);exit(1);}
  while((i=fscanf(fp,"%d", &a[256]))!=EOF){
	printf("%d\n",a[256]);
  }
  fclose(fp);
}

Re: ファイルの入出力について

Posted: 2013年10月06日(日) 02:57
by Poco
こちらでコンパイルすらしていませんが、

× fp = fopen("argv[1]","rt");
○ fp = fopen(argv[1],"rt");

かと。
argv[1]という文字列ではなく、argv[1]変数が指している文字列にしないと。

Re: ファイルの入出力について

Posted: 2013年10月06日(日) 08:13
by 初級者
ついでに補足します。
argcが1だったりfpがNULLだったり
していてもそのまま続行するように
なっているのは、とてもまずいと
思います。

Re: ファイルの入出力について

Posted: 2013年10月06日(日) 08:47
by みけCAT
a[256]がchar型なのに%dでint型(char型よりサイズが大きいことが多い)の値を代入しようとしており、
しかもa[256]という範囲外の要素にアクセスしているので、かなり危険だと感じます。
オフトピック
厳密に言うと、本当に危険かはコンパイラの実装などに依存し、微妙なところですが・・・

Re: ファイルの入出力について

Posted: 2013年10月06日(日) 14:19
by ライム
みなさん、回答ありがとうございます。
Pocoさんのおっしゃった通り訂正すると、開きました。
fpの中身の””は、中に記述される文字列のファイルを開くということなんですね。
よくわかりました。
argcが1だったりfpがNULLだったりする場合には、exit(1)で異常終了するようにしました。
Pocoさん、初級者さん、みけCATさん、ありがとうございました。
これからもお世話になると思いますので、どうぞよろしくお願いします。