0

在 DOS 上使用 DJGPP 读取二进制文件时,此代码挂起。这发生在进行 fread 调用时。如果调用被删除,则程序成功运行。相同的代码在 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; 
}
4

2 回答 2

3
  • 我不明白'fp'是什么。我只需要假设它是'FILE * fp;'。

  • 我没有看到您实际上包含 < stdio.h >,并且必须假设您这样做。

  • 我没有看到您实际上包含 <iostream> 并声明“使用命名空间 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()' 而不是自制的 cout 消息可以为您提供有关任何错误原因的更多信息。使用 'fgetc()' 将告诉您该文件确实包含您认为的内容,并且您的问题不是由于对单个字节使用 fread() 有点不常见。

然后回来汇报。

于 2009-03-23T11:51:48.120 回答
0

fread将指针作为第一个参数。如果你只需要读入一个字符,char x;那很好,但要传递 x 的地址。

fread(&x,sizeof(x),1,fp) != sizeof(x)

并且由于 sizeof char 始终为 1(根据定义),您可以很好地编写:

fread(&x,1,1,fp) != 1
于 2009-03-20T17:11:13.883 回答