2013-03-29 65 views
0

我有两个程序:程序A(在FORTRAN中)和程序B(在C++中)。他们通过管道相互连接。方案B应直接从程序A的控制台读取二进制数据,但由于某种原因,我不能做到这一点:使用ReadFile()函数读取Windows中的二进制数据

以下是节目B的阅读部分:

BOOL bSuccess = FALSE; 
LPBYTE File_Data; 
DWORD dwFileSize; 
wFileSize = GetFileSize(V_hChildStd_OUT_Rd, NULL); 
File_Data = new BYTE[dwFileSize+1]; 
bSuccess = ReadFile(V_hChildStd_OUT_Rd, File_Data, dwFileSize, &dwRead, NULL); 
delete [] File_Data; 

注:V_hChildStd_OUT_Rd是一个句柄程序A的输出。

如果我传递一个,两个或三个数字的整数(例如1或10或100),程序将工作,我可以在File_Data数组中获取数字。但是对于较大的整数和所有的双数,File_Data给出的意义较小。请注意,对于所有数字,我的bSuccess为TRUE!这意味着它可以读取文件。 你能帮我解决这个问题吗?谢谢!

+1

由于事先不知道大小,所以不能在管道上使用'GetFileSize'。 –

回答

2

你不能使用GetFileSize()管道,只有文件。要确定有多少数据可用于从管道读取,请改用PeekNamedPipe()。并注意输出值,它告诉你实际读取的字节数,可能少于你请求的字节数。

+0

感谢您的快速回复。我会尝试PeekNamedPipe()。但即使我将大小指定为常数,例如双字节的8个字节,仍然无法读取双数字:File_Data = new BYTE [8] – VecTor

+0

@VecTor您确定FORTRAN和C++使用相同的格式为双打?这对你的程序来说至关重要。 – john

+0

如果我不使用管道,只需用FORTRAN写入二进制文件并通过C++从文件中读取,它就可以正常工作:file.read((char *)&a,sizeof(double));问题是当我使用ReadFile()函数和管道。 – VecTor