ファイル出力

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ファイル出力

Re: ファイル出力

#6

by かずま » 7年前

A.Y. さんが書きました: 大学の課題でプログラムを作るよう言われたのですが、作成しコンパイル時にエラーは出ないのですがexeファイルを起動するとtxtファイルが出力されていません。
次の項目をはっきり示してください。
・入力データ(input.cvs の内容)
・実行結果の出力データ(outout1.txt と output2.txt の内容)
・期待される出力データ(outout1.txt と output2.txt の内容)

さらに、上記は異なる複数のデータがあることが望ましい。

Re: ファイル出力

#5

by みけCAT » 7年前

0x30は48なので、41行目の(ch>=0x30)&&(ch<=39)は常に偽になるはずであり、不自然ですね。
(ch>=0x30)&&(ch<=0x39)、もしくは(ch>='0')&&(ch<='9')とするべきではないでしょうか?
chをint型にした場合、ctypes.hをincludeしてisdigit(ch)とするのもいいかもしれません。
(char型のままだと、isdigitに仕様範囲外の負の値が渡され、未定義動作になるリスクが発生します)

Re: ファイル出力

#4

by みけCAT » 7年前

さらによく見ると、49行目にも(ch=0x0d)という、条件式としては常に真になる不自然な代入がありますね。
また、比較に変更したとしても、「exeファイル」と書かれていることから環境はWindowsであると推測され、ファイルをバイナリモードで開かないと0x0dは変換されて消えるかもしれません。

Re: ファイル出力

#3

by みけCAT » 7年前

よく見ると、fcloseした後のファイルポインタをfgetcに渡すのは不自然なので、29行目のwhile文のブロックの範囲がおかしい可能性が考えられますね。

Re: ファイル出力

#2

by みけCAT » 7年前

A.Y. さんが書きました:コンパイル時にエラーは出ないのですがexeファイルを起動するとtxtファイルが出力されていません。
GCC 4.8.1でコンパイルすると、コンパイルエラーになりました。

コード:

raw1.c: In function 'main':
raw1.c:72:2: warning: suggest parentheses around assignment used as truth value
[-Wparentheses]
  if(ch=EOF){
  ^
raw1.c:82:2: warning: format '%d' expects argument of type 'int', but argument 3
 has type 'char *' [-Wformat=]
  fprintf(fp,"%d",arr);
  ^
raw1.c:84:1: error: expected declaration or statement at end of input
 }
 ^
raw1.c:84:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
末尾に}を補ってコンパイルすると、通りました。
空(0バイト)のinput.csvを用意するとtxtファイルは出力されませんでしたが、
「a(改行)」という内容のinput.csvを用意するとoutput1.txtおよびoutput2.txtが出力されました。
A.Y. さんが書きました:どのように改良すればよいか教えていただけないでしょうか?
プログラムの改良としては、
  • インデントをきちんと整える
  • 82行目でint型のデータを要求する書式%dに対し、配列から変換されるchar*型のデータを渡しており、未定義動作になっているので、適切な書式(文字列を出力するなら%s)にする
  • fopenの返り値がNULLでないか(ファイルのオープンに成功したか)をチェックし、NULLの場合はNULLが他のファイル操作関数に渡されないように処理をやめるようにする
  • fgetcの返り値をchar型の変数に入れてしまうとEOFと通常のデータが見分けられなくなることが考えられるので、chをint型にする
  • 72行目でせっかくfgetcで取得した文字をすぐにEOFで上書きしているのは不自然なので、比較に変更するなど見直す
などが考えられます。

質問の改良としては、
  • 「コンパイル時にエラーは出ない」と主張するなら、コンパイル時にエラーが出ない完全なコードを提示する
  • 今観測される挙動だけでなく、期待する挙動(入力例とそれに対応する出力例など)も書く
といいでしょう。

ファイル出力

#1

by A.Y. » 7年前

コード:

初めまして。
大学の課題でプログラムを作るよう言われたのですが、作成しコンパイル時にエラーは出ないのですがexeファイルを起動するとtxtファイルが出力されていません。
どのように改良すればよいか教えていただけないでしょうか?


コード:

#include<stdio.h>

int stn(char ar[],int n){
	int i=0,num=0,thous=1;
	for(i=0;i<(n-1);i++){
	thous=thous*10;
	}


	for(i=0;i<n;i++){
	num=num+((ar[i]-0x30)*thous);
	thous=thous/10;
	}
	return(num);

}

	int main(void){
	FILE*fp;
	char ch,str[5],array[50],arr[50];
	int i=0,j=0,number=0;
	char*ptr;

	ptr=&array[0];


	fp=fopen("input.csv","r");
	
	while(1){


	ch=fgetc(fp);

	if(ch==EOF){

	*(ptr+i)=0;
	break;

	}

	if((ch>=0x30)&&(ch<=39)){


	str[i]=ch;
	i++;

	}

	else if((ch==',')||(ch=0x0d)){

	str[i]=0;
	number=stn(str,i);
	i=0;
	*(ptr+j)=number;
	j++;

}
	fclose(fp);


	fp=fopen("output1.txt","w");
	fprintf(fp,array);
	fclose(fp);
	
	
	fp=fopen("output1.txt","r");

	while(1){

	ch=fgetc(fp);

	if(ch=EOF){
	arr[i]=0;
	break;
	}
	else{
	arr[i]=ch+0x01;
	i++;
	}
	}
	fp=fopen("output2.txt","w");
	fprintf(fp,"%d",arr);
	fclose(fp);
}

ページトップ