在DOS上使用DJGPP读取二进制文件时,此代码挂起。 进行远程调用时会发生这种情况。如果删除了呼叫,则程序成功运行。 相同的代码通过Visual C ++ 2008运行良好。 有没有人遇到与djgpp类似的问题? 我错过了一些非常简单的事情吗?
char x;
string Filename = "my.bin" ;
fp = fopen(Filename.c_str(),"rb");
if (fp == NULL)
{
cout << "File not found" << endl ;
}
if (fseek (fp, 0, SEEK_END) != 0)
{
cout <<"End of File can't be seeked";
return -1;
}
if ( (fileLength = ftell(fp)) == -1)
{
cout <<"Can't read current position of file";
return -1;
}
if (fseek (fp, 0, SEEK_SET) != 0)
{
cout <<"Beginning of File can't be seeked";
return -1;
}
if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
cout <<"file not read correctly";
return -1;
}
答案 0 :(得分:2)
我没看到'fp'是什么。我只需假设它是'FILE * fp;'。
我没有看到你实际包含&lt; stdio.h&gt;,并且必须假设你这样做。
我没有看到你实际包含&lt; iostream&gt;并声明'using namespace std;',并且必须假设你这样做。
我看不到fread()调用之后会发生什么,可以告诉你调用是否成功。
实际上将错误代码减少到绝对但完全最小化以重现错误的过程是你在一段代码让你傻眼的时候应该做的第一件事。
它可能(并且通常确实)证明问题甚至不在您认为的地方。
话虽如此,我会尝试更换
if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
cout <<"file not read correctly";
return -1;
}
与
int i;
if ( ( i = fgetc( fp ) ) == EOF )
{
perror( "File not read correctly" );
return -1;
}
x = (char) i;
cout << "Success, read '" << x << "'." << endl;
使用'perror()'而不是homebrewn cout消息可以提供有关任何错误原因的其他信息。使用'fgetc()'将向您显示文件实际上包含您认为它的作用,并且您的问题不是由于fread()对于单个字节的使用有点不常见。
然后报告。
答案 1 :(得分:0)
fread将指针作为第一个参数。如果你只需要阅读一个字符,char x;
就可以了,但是要传递x的地址。
fread(&x,sizeof(x),1,fp) != sizeof(x)
因为sizeof char总是1(根据定义)你可以写得很好:
fread(&x,1,1,fp) != 1