ファイル出力がうまくいかない

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

ファイル出力がうまくいかない

#1

投稿記事 by dic » 15年前

vector<wchar_t> vs2 の内容をテキストに出力する補助関数のコードを作りました
下がそうなのですが、ファイルのオープンには成功しているのですが、
書き込み処理で失敗しているようです。
VC++2008のデバッカで追うと「不適切なPtr」とでていてて何が原因か分かりません
原因の分かる方いらっしゃらないでしょうか?
/---------------------------------------------------------------
//	vs2 の内容を step3.txt に出力する
void	wCVectorStep3()
{
	FILE	*file = fopen( "wstep3.txt", "wt" );
	if( file == NULL )
		MessageBox( NULL, "error", "error", MB_OK );
	int		i;
	for( i=0; i<vs2.size(); i++ )
	{
		wchar_t	buf[10240];
		memset( buf, 0, sizeof(buf) );
		wcscpy( buf, vs2.at(i) );
		int	error =	fputws( buf, file );
		if( error < 0 )
			printf( "error\n" );
	}
}

Justy

Re:ファイル出力がうまくいかない

#2

投稿記事 by Justy » 15年前

 vs2は std::vector<wchar_t>なのですから、vs2.at(i)の戻り値は
wchar_t型の参照になります。

 これはポインタではないので wcscpyの行でコンパイルエラーが
発生すると思われますが、実行できている……。

 何か情報が間違っていませんか?


 あと、処理が終わったら fcloseし、fopenに失敗しているのなら fputwsは
しないようにして下さい。

Poco

Re:ファイル出力がうまくいかない

#3

投稿記事 by Poco » 15年前

これ、コンパイルできないですよ。

vs2はvector<wchar_t>ではなくて、
vector<wchar_t*>では?

あと、問題となった関数だけじゃなくて、
問題を再現させるプログラムを載せていただけると助かるのですが。

dic

Re:ファイル出力がうまくいかない

#4

投稿記事 by dic » 15年前

すいません、イージーミスしてました
vector<wchar_t*> vs2 です
fclose も入れておきました

問題のソースコードと、処理するデータ(テキストファイル)を一緒にあげておきます
http://www1.axfc.net/uploader/He/link.p ... 253347.zip

VC++6  VC++2008 Express  どちらでもコンパイルできて、実行もできます・・・

Justy

Re:ファイル出力がうまくいかない

#5

投稿記事 by Justy » 15年前

 dic_SDKというのがないので、該当箇所がどこだかよくわからないのですが、
vs2.at(i)に 10240文字未満の正しい文字列へのポインタが入っていて、
最後に fcloseされているなら書き込まれると思いますが、
何がどう失敗しているのでしょう?

dic

Re:ファイル出力がうまくいかない

#6

投稿記事 by dic » 15年前

送付ミスしました
ミス続きですね 今日はちょっと休みます

GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません。

だったので

remove( "wstep3.txt" );

を前に挿入したところエラーはでなくなりました

うまくいってるか
今、結構ファイルあるんで、走らせてます

Justy

Re:ファイル出力がうまくいかない

#7

投稿記事 by Justy » 15年前

 最初の投稿の「不適切なPtr」はキャプチャを見る限り Fileポインタとしては
値が入っていますので、気にする必要はありません。

 さてそうなると、「書き込み処理で失敗」というのはどこで何がどう失敗しているのか、
が問題になります。
 まだ問題がのこっているようでしたら、このあたりを補足して下さい。



>GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません

 何の関数を呼んだあとに GetLastErrorで調べたのですか?

 なんか直感的に fopenの後って気がするので、一応念のために書いておきますと
fopenのエラー内容は状況を調べる方法はその戻り値とグローバル変数 errnoで、
GetLastErrorではありません。

dic

Re:ファイル出力がうまくいかない

#8

投稿記事 by dic » 15年前

ソース一式
http://www1.axfc.net/uploader/He/so/253519
//---------------------------------------------------------------
//	vs2 の内容を step3.txt に出力する
void	wCVectorStep3()
{
	remove( "wstep3.txt" );
	FILE	*file = fopen( "wstep3.txt", "wt" );
	if( file == NULL ){
		MessageBox( NULL, "error", "error", MB_OK );
		return;
	}
	//	ファイルのオープンには成功している

	int		i;
処理するファイルが600個あるのですが、509個目で必ず、fopenに失敗してました
OSの動作が不安定なのか再起動もしてみましたが、改善されませんでした
508個はfopen成功してるのですが・・・
VC++6.0です
これは・・・原因がつかめません

softya

Re:ファイル出力がうまくいかない

#9

投稿記事 by softya » 15年前

fopenの同時オープンの上限数制限に引っかかっています。
どうしてfcloseしていないのでしょうか?

Justy

Re:ファイル出力がうまくいかない

#10

投稿記事 by Justy » 15年前

 vs2は std::vector<wchar_t*>なわけですが、問題はこのポインタです。
 vs2に対して push_backしているポインタは、例えば wCVectorStep2_1関数を見てみると
[color=#d0d0ff" face="monospace]
wchar_t copy[10240];
memset( copy, 0, sizeof(copy) );
...
wcscat( copy, b2 );
vs2.push_back( copy );
[/color]

と、ローカル変数の配列に対するポインタを入れています。

 これでは関数を抜けた後、copy変数は破棄されますので、
push_backしたポインタも無効になってしまいます。

 無効になったポインタを fputws()すれば失敗してもおかしくはありません。


 std::vector<wchar_t*>はやめて、普通に std::vector<std::wstring>を
使うのがいいかと思います。

dic

Re:ファイル出力がうまくいかない

#11

投稿記事 by dic » 15年前

う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね

std::vector<wchar_t*> はこれの次に確認しようかなぁって思ってたんですよね
>std::wstring こんなのもあったんですね
いろいろ試してみます

softya

Re:ファイル出力がうまくいかない

#12

投稿記事 by softya » 15年前

>う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね

どちらにしても、fcloseまでの間にfopenしている数が多すぎます。
512-3(stdin,stdout,stderr)が上限ですので無理やり増やすか、
http://msdn.microsoft.com/ja-jp/library/6e3b887c(VS.80).aspx
そもそも処理を考え直すかしてください。

dic

Re:ファイル出力がうまくいかない

#13

投稿記事 by dic » 15年前

関数 wCVectorStep1( char *filename );
でfclose();してませんでした
これも原因ですね

dic

Re:ファイル出力がうまくいかない

#14

投稿記事 by dic » 15年前

続きの質問がありますが、別の話になるので解決押して起きます

dic

Re:ファイル出力がうまくいかない

#15

投稿記事 by dic » 15年前

ファイル出力もfclose()関数を適切に追加することで期待したどおりの動作をしました

閉鎖

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