よろしくおねがいします。
「Gzip for Windows」( http://gnuwin32.sourceforge.net/packages/gzip.htm) 
という、windows用のgzip形式のファイルを圧縮、伸張するソフトを利用して、ファイル
処理を行いたいのですが、
圧縮ファイルを解凍して、解凍後のファイルをオープンしようとすると
正常に解凍されているにも関わらず、ファイルを開くことが出来ません
一旦、プログラムを終了して、予め解凍後のファイルが存在する状態で、2回目を実行す
ると成功するのですが、これでは使い物になりません、間違い、錯誤等ご教示願えません
でしょうか。
補足
尚、解凍ソフトに、「解凍レンジ」( http://www.vector.co.jp/soft/win95/util 
/se094501.html)
を利用して、似たようなプログラムを書いても、同様の問題が発生します。
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
	ShellExecute(NULL, (LPCSTR)open, gunzip, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);
	string oneline;
	fstream open_file(c:\\mail\\analysis.log, ios::in);
	if(open_file.fail()) {
		cout << file open error!! << endl;
		return 1;
	}
	while( getline(open_file, oneline) ) {
		cout << oneline << endl;
	}
	return 0;
}
ShellExecute(NULL, (LPCSTR)open, gunzip, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);
ShellExecuteの処理がまだ完了しないうちに、オープンしてるのでは?
ShellExecuteExあたりでプロセスハンドルをつかんで、
WaitForSingleObjectとかで終了待ちしてみるとどうなります?
Banさんお世話になります。
アドバイスを参考に、過去ログ等検索して、見よう見まねでこのように実装して見ました
が、自信がありません。
Banさんをはじめ、皆様方へお願いですが
間違い、私の錯誤等ございましたら、引き続きご教示願います。
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
BOOL WaitGzip();
int main(int argc, char* argv[])
{
	if(WaitGzip()) {
		string oneline;
		fstream open_file(c:\\mail\\analysis.log, ios::in);
		if(open_file.fail()) {
			cout << file open error!! << endl;
		return 1;
		}
		while( getline(open_file, oneline) ) {
			cout << oneline << endl;
		}
		return 0;
	}
}
BOOL WaitGzip() 
{
	char	*pszWork1 = gunzip;
	//Gzipを起動する
	ShellExecute(NULL, (LPCSTR)open, pszWork1, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);
	//初期化
	SHELLEXECUTEINFO	sei = { 0 };
	//構造体のサイズ
	sei.cbSize = sizeof(SHELLEXECUTEINFO);						
	//起動側のウインドウハンドル
	//sei.hwnd = m_hWnd;
	//起動後の表示状態
	sei.nShow = SW_SHOWNORMAL;									
	//メインプログラムを待機パラメータ
	sei.fMask = SEE_MASK_NOCLOSEPROCESS;						
	//起動プログラム
	sei.lpFile = (LPCSTR)pszWork1;								
	//プロセス起動
	if(!ShellExecuteEx(&sei) || (const int)sei.hInstApp <= 32){	
		cerr << error ShellExecuteEx << endl;
		return FALSE;
	}
	//終了を待つ
	WaitForSingleObject( sei.hProcess, INFINITE ) ;
	return TRUE;
}
Ex使うときは、ShellExecuteをShellExecuteExにしてください。
 つまり、既存のShellExecute自体は要らない
で、ShellExecuteで指定してたものは、Exの方にも反映してください。
 SW_HIDE⇒SW_SHOWNORMALに変わってますが意図通りですか?とか、
 verbなくなってますけど?とか。
あと、取ったハンドルはちゃんと閉じてください。
MSDN
The calling application is responsible for closing the handle when it is no 
longer needed.
Ban さん、お世話になります。
ご指摘、ご指導ありがとうございます。
このように修正してみました、解決とさせて頂きたいと思います。
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
BOOL WaitGzip();
int main(int argc, char* argv[])
{
	if(WaitGzip()) {
		string oneline;
		fstream open_file(c:\\mail\\analysis.log, ios::in);
		if(open_file.fail()) {
			cout << file open error!! << endl;
		return 1;
		}
		while( getline(open_file, oneline) ) {
			cout << oneline << endl;
		}
	}
	return 0;
}
BOOL WaitGzip()
{
	//外部起動プログラム名
	const char	*pszWork1 = gunzip;
	//パラメータ
	const char	*pszFpath = c:\\mail\\access_log.1.gz;
	//初期化
	SHELLEXECUTEINFO	sei = { 0 };
	//構造体のサイズ
	sei.cbSize = sizeof(SHELLEXECUTEINFO);	
	//起動後の表示状態
	sei.nShow = SW_HIDE;
	//メインプログラム待機設定パラメータ
	sei.fMask = SEE_MASK_NOCLOSEPROCESS;
	//起動モード
	sei.lpVerb = open;
	//外部起動プログラム
	sei.lpFile = (LPCSTR)pszWork1;
	//パラメータ
	sei.lpParameters = (LPCSTR)pszFpath;
	//プロセス起動
	if(!ShellExecuteEx(&sei) || (const int)sei.hInstApp <= 32) {
		cerr << error ShellExecuteEx << endl;
		return FALSE;
	}
	//終了を待つ
	WaitForSingleObject( sei.hProcess, INFINITE );
	//ハンドルを閉じる
	::CloseHandle(sei.hProcess);
	return TRUE;
}

 
  
  
  
  