質問です。

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

質問です。

#1

投稿記事 by へたれ » 16年前

いつもお世話になっています。今回もアドバイスを頂きたく質問させてもらいます。
まず、このソースファイルを見てもらいたいのですが
main(void){
	char filename1[256], filename2[256];
	FILE *fd1, *fd2;
	int i, m, n;
	fprintf( stderr, "入力ファイル: " );
	scanf( "%s", filename1 );
	fd1 = fopen( filename1, "r" );
	if( fd1 == NULL ){
		puts( "Error: File doesn't open it. \n" );
		exit(1);
	}
	
	fprintf( stderr, "出力ファイル: " );
	scanf( "%s", filename2 );
	fd2 = fopen( filename2, "r" );
	if( fd2 == NULL ){
		puts( "Error: File doesn't open it. \n" );
		exit(1);
	}
}
これはファイルの入出力のプログラムなのですが、この状態だと入力ファイルの名前はもちろんのこと、出力ファイルの名前も打ち込まなければなりません。
自分としては出力ファイルの名前の入力を省略したいのですが…

例としては、入力ファイルの名前をabc.txtとしたら、
出力ファイルの名前をabc1.txtのようにしたいのですが、やり方がいまいちわかりません。
strcpyを使うのかな?とかも思うのですが…

分かる方がいらっしゃいましたら、ぜひご教授をお願いします。

non

Re:質問です。

#2

投稿記事 by non » 16年前

こんなんで、どうでしょう。ただ、拡張子がない場合(ピリオドがない場合など)のエラー処理を
加えるべきだとは思います。
#include <stdio.h>
void makefilename(char *s1,char *s2)
{
	while(*s1!='\0'){
		if(*s1=='.')
			*s2++='1';
		*s2++=*s1++;
	}
	*s2='\0';
}
	
int main(void)
{
	char filename1[256], filename2[256];
	fprintf( stderr, "入力ファイル: " );
	scanf( "%s", filename1 );
	makefilename(filename1,filename2);
	puts(filename2);
	return 0;
}

へたれ

Re:質問です。

#3

投稿記事 by へたれ » 16年前

non様、回答ありがとうございます。
これで数字はつけることが出来ました。
しかし、文字をつけようとすると

'=' : 'const int ' から 'char ' へ切り詰めます。

と、エラーが出てしまうのですが、どうすればいいでしょうか?
度々申し訳ありません。

non

Re:質問です。

#4

投稿記事 by non » 16年前

> しかし、文字をつけようとすると
>
> '=' : 'const int ' から 'char ' へ切り詰めます。
>
> と、エラーが出てしまうのですが、どうすればいいでしょうか?

意味がわかりません。プログラムを載せて下さい。
または、具体的にどの様な文字をつけたいのか書いて下さい。

へたれ

Re:質問です。

#5

投稿記事 by へたれ » 16年前

説明不足で申し訳ありませんでした。
文字というのは
while(*s1!='\0'){
		if(*s1=='.')
			*s2++='1';
		*s2++=*s1++;
の'1'の部分を's1'などにしたいのですが、上記のエラーが出てしまい
実行結果としてはs1はつかず、1だけついてしまうのですが…

non

Re:質問です。

#6

投稿記事 by non » 16年前

元のファイル名が
test.txtの場合tests1.txtにしたいということでしょうか?
そうならこうなります。
while(*s1!='\0'){
		if(*s1=='.'){
			*s2++='s';        
			*s2++='1';
		}
		*s2++=*s1++;

Mist

Re:質問です。

#7

投稿記事 by Mist » 16年前

"s1"の場合、2文字ですからchar一個(1バイト)にはおさまりません。
入れるためには2バイト必要ですので以下のようにしてみるとか。
if(*s1=='.') {
			*s2++='s';
                           *s2++='1';
                  }

フリオ

Re:質問です。

#8

投稿記事 by フリオ » 16年前

 
 タイトルは、内容がわかるようにしてほしいです。

 "sprintf"を使って、こんな感じでどうでしょうか。
#include <stdio.h>
#include <string.h>

void MakeFilename(char *s1, const char *s2, const char *s3)
{
	int i = strlen(s2);
	
	while(i --){
		if(s2 == '.') break;
	}
	if(i < 0) sprintf(s1, "%s%s", s2, s3);
	else sprintf(s1, "%.*s%s%s", i, s2, s3, s2 + i);
}

int main(void)
{
	char s1[32], s2[32];
	
	printf("File Name :");
	scanf("%s", s2);
	MakeFilename(s1, s2, "_out");
	puts(s1);
	return 0;
}

へたれ

Re:質問です。

#9

投稿記事 by へたれ » 16年前

まずお返事が遅れたことを謝罪します。
そして、回答・アドバイスを提案してくれた
non様、Mist様、フリオ様本当にありがとうございます。

non様とMist様の方法も、フリオ様の方法も試してみたところ
プログラムを思い通りに実行する事ができました。

知識不足でお恥ずかしいのですが、自分で出来る限り努力してみて
疑問に思ったことがあれば今後もご教授のほどをお願い致します。

タイトルは今後気をつけます。

閉鎖

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