ページ 1 / 1
ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 15:20
by dic
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" );
}
}
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 15:57
by Justy
vs2は std::vector<wchar_t>なのですから、vs2.at(i)の戻り値は
wchar_t型の参照になります。
これはポインタではないので wcscpyの行でコンパイルエラーが
発生すると思われますが、実行できている……。
何か情報が間違っていませんか?
あと、処理が終わったら fcloseし、fopenに失敗しているのなら fputwsは
しないようにして下さい。
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 16:14
by Poco
これ、コンパイルできないですよ。
vs2はvector<wchar_t>ではなくて、
vector<wchar_t*>では?
あと、問題となった関数だけじゃなくて、
問題を再現させるプログラムを載せていただけると助かるのですが。
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 16:50
by dic
すいません、イージーミスしてました
vector<wchar_t*> vs2 です
fclose も入れておきました
問題のソースコードと、処理するデータ(テキストファイル)を一緒にあげておきます
http://www1.axfc.net/uploader/He/link.p ... 253347.zip
VC++6 VC++2008 Express どちらでもコンパイルできて、実行もできます・・・
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 17:29
by Justy
dic_SDKというのがないので、該当箇所がどこだかよくわからないのですが、
vs2.at(i)に 10240文字未満の正しい文字列へのポインタが入っていて、
最後に fcloseされているなら書き込まれると思いますが、
何がどう失敗しているのでしょう?
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 18:49
by dic
送付ミスしました
ミス続きですね 今日はちょっと休みます
GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません。
だったので
remove( "wstep3.txt" );
を前に挿入したところエラーはでなくなりました
うまくいってるか
今、結構ファイルあるんで、走らせてます
Re:ファイル出力がうまくいかない
Posted: 2009年11月21日(土) 20:02
by Justy
最初の投稿の「不適切なPtr」はキャプチャを見る限り Fileポインタとしては
値が入っていますので、気にする必要はありません。
さてそうなると、「書き込み処理で失敗」というのはどこで何がどう失敗しているのか、
が問題になります。
まだ問題がのこっているようでしたら、このあたりを補足して下さい。
>GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません
何の関数を呼んだあとに GetLastErrorで調べたのですか?
なんか直感的に fopenの後って気がするので、一応念のために書いておきますと
fopenのエラー内容は状況を調べる方法はその戻り値とグローバル変数 errnoで、
GetLastErrorではありません。
Re:ファイル出力がうまくいかない
Posted: 2009年11月22日(日) 18:07
by dic
ソース一式
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です
これは・・・原因がつかめません
Re:ファイル出力がうまくいかない
Posted: 2009年11月22日(日) 18:36
by softya
fopenの同時オープンの上限数制限に引っかかっています。
どうしてfcloseしていないのでしょうか?
Re:ファイル出力がうまくいかない
Posted: 2009年11月22日(日) 18:39
by Justy
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>を
使うのがいいかと思います。
Re:ファイル出力がうまくいかない
Posted: 2009年11月22日(日) 21:32
by dic
う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね
std::vector<wchar_t*> はこれの次に確認しようかなぁって思ってたんですよね
>std::wstring こんなのもあったんですね
いろいろ試してみます
Re:ファイル出力がうまくいかない
Posted: 2009年11月22日(日) 21:50
by softya
>う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね
どちらにしても、fcloseまでの間にfopenしている数が多すぎます。
512-3(stdin,stdout,stderr)が上限ですので無理やり増やすか、
http://msdn.microsoft.com/ja-jp/library/6e3b887c(VS.80).aspx
そもそも処理を考え直すかしてください。
Re:ファイル出力がうまくいかない
Posted: 2009年11月23日(月) 15:45
by dic
関数 wCVectorStep1( char *filename );
でfclose();してませんでした
これも原因ですね
Re:ファイル出力がうまくいかない
Posted: 2009年11月27日(金) 19:16
by dic
続きの質問がありますが、別の話になるので解決押して起きます
Re:ファイル出力がうまくいかない
Posted: 2009年11月27日(金) 19:17
by dic
ファイル出力もfclose()関数を適切に追加することで期待したどおりの動作をしました