C++ 在C/C+中与fopen行为不一致+;

C++ 在C/C+中与fopen行为不一致+;,c++,file,file-io,fopen,C++,File,File Io,Fopen,我正在使用一个库,它多次打开同一个文件。它会检查文件头以确保其格式正确。打开文件的前1212次,其行为正常。第1213次,从文件中读取的字节不同。有人能提出为什么会发生这种情况吗 不幸的是,我不能做一个小的可复制的例子,并且需要20分钟来完成这一点。所以我想知道fopen是否有一些我可能遗漏的微妙之处,或者其他一些可能与执行有关的东西 代码如下。创建了该类的许多实例,每个实例都使用相同的文件名调用了initialise()。前1212次,输出为: Expecting: '?' ?lon-1800

我正在使用一个库,它多次打开同一个文件。它会检查文件头以确保其格式正确。打开文件的前1212次,其行为正常。第1213次,从文件中读取的字节不同。有人能提出为什么会发生这种情况吗

不幸的是,我不能做一个小的可复制的例子,并且需要20分钟来完成这一点。所以我想知道fopen是否有一些我可能遗漏的微妙之处,或者其他一些可能与执行有关的东西

代码如下。创建了该类的许多实例,每个实例都使用相同的文件名调用了initialise()。前1212次,输出为:

Expecting: '?'
?lon-1800????%@LYB1800????%@LYB100????%@LYB
                                       lat-900??p-2?%@HYB900??p-2?%@HYB10??p-2?%@HYB
                                                                                    ?   soilcode0   ??  ?-2?&@AYB12 ??  ?-2?&@AYB1  ??  ?-2?&@AYBmtemp-600??x.2?&@6YB600??x.2?&@6YB10??x.2?&@6YB
             ?mprec0???H2?&@.YB99999???H2?&@.YB1999???H2?&@.YB?msun0???A2?&@%YB1000???A2?&@%YB100???A2?&@%YB
?

Got: '?'
?lon-1800????%@LYB1800????%@LYB100????%@LYB
                                       lat-900??p-2?%@HYB900??p-2?%@HYB10??p-2?%@HYB
                                                                                    ?   soilcode0   ??  ?-2?&@AYB12 ??  ?-2?&@AYB1  ??  ?-2?&@AYBmtemp-600??x.2?&@6YB600??x.2?&@6YB10??x.2?&@6YB
             ?mprec0???H2?&@.YB99999???H2?&@.YB1999???H2?&@.YB?msun0???A2?&@%YB1000???A2?&@%YB100???A2?&@%YB
?
我最后一次得到:

Expecting: '?'
?lon-1800????%@LYB1800????%@LYB100????%@LYB
                                       lat-900??p-2?%@HYB900??p-2?%@HYB10??p-2?%@HYB
                                                                                    ?   soilcode0   ??  ?-2?&@AYB12 ??  ?-2?&@AYB1  ??  ?-2?&@AYBmtemp-600??x.2?&@6YB600??x.2?&@6YB10??x.2?&@6YB
             ?mprec0???H2?&@.YB99999???H2?&@.YB1999???H2?&@.YB?msun0???A2?&@%YB1000???A2?&@%YB100???A2?&@%YB
?

Got: '   lon       lat    year  
功能如下:

class Archive {
private:
FILE* pfile;
<snip>
    bool initialise(char* filename) {

    int i;
    unsigned char* pheader;

    if (pfile) fclose(pfile);
    pfile=fopen(filename,"rb");
    if (!pfile || pfile == NULL ) {
        printf("Could not open %s for input\n",filename);
        return false;
    }

    pheader=new unsigned char[CRU_1901_2002_HEADERSIZE-4];
    if (!pheader) {
        printf("Out of memory\n");
        fclose(pfile);
        pfile=NULL;
        return false;
    }
    ::rewind(pfile);
    fread(pheader,CRU_1901_2002_HEADERSIZE-4,1,pfile);

    printf( "Expecting: '%s'\n", CRU_1901_2002_HEADER);
    for( int j = 0; j < CRU_1901_2002_HEADERSIZE-4;j++ )
        printf( "%c", CRU_1901_2002_HEADER[j]);
    printf( "\nGot: '%s'\n", pheader);
    for( int j = 0; j < CRU_1901_2002_HEADERSIZE-4;j++ )
        printf( "%c", pheader[j]);
    printf( "\n");
    for (i=0;i<CRU_1901_2002_HEADERSIZE-4;i++) {
        if (pheader[i]!=CRU_1901_2002_HEADER[i]) {
            fclose(pfile);
            pfile=NULL;
            delete pheader;
            return false;
        }
    }
    delete pheader;

    ::rewind(pfile);
    fseek(pfile,CRU_1901_2002_HEADERSIZE+CRU_1901_2002_DATA_LENGTH*CRU_1901_2002_NRECORD,SEEK_CUR);
    recno=0;
    iseof=false;

    return true;
}

public:
Archive() {
    pfile=NULL;
}

Archive() {
    if (pfile) fclose(pfile);
}
类存档{
私人:
文件*pfile;
布尔初始化(字符*文件名){
int i;
无符号字符*pheader;
如果(pfile)fclose(pfile);
pfile=fopen(文件名,“rb”);
如果(!pfile | | pfile==NULL){
printf(“无法打开%s进行输入,\n”,文件名);
返回false;
}
pheader=新的无符号字符[CRU_1901_2002_HEADERSIZE-4];
如果(!pheader){
printf(“内存不足\n”);
fclose(pfile);
pfile=NULL;
返回false;
}
::倒带(pfile);
fread(pheader,CRU_1901_2002_HEADERSIZE-4,1,pfile);
printf(“应为:'%s'\n',CRU_1901_2002_头);
对于(int j=0;j对于(i=0;i您确定第1213个位置有数据吗?或者,这些数据正确吗?

我建议您挂载一个包含超过1213条记录的文件,并进行测试,以确认此位置是否存在读取错误。

结果表明,这是由于打开的文件太多。将程序更改到其他位置以打开较少的文件可修复此问题

检查fread返回1,但最后一个返回0


然而,我不明白为什么FOpenC++在文件无法打开时返回一个非空文件指针。在测试代码中,它返回NULL,然后它被如期捕获。

我们陷入第一个障碍——什么是代码> pfile < /Cord>?这是因为PFILE没有初始化。这是真正的代码吗?@ M. SePh:你发布的代码没有错。我猜你的代码中的其他部分有一个指针错误或其他错误,这会导致问题。这个代码使用指针的方式,我认为非常易变。ink您的代码中的其他地方可能有指针错误。fseek和fread返回一个状态,但您忽略了它,修复它可能会给您一个关于发生了什么的线索。它将第1213次打开同一个文件,因此不应该有任何更改。