0

これが mac32 で実行される場合、正常に実行されます。win32で実行すると、ピクセル139で予期しないファイルの終わりが発生し、fseekをコメントアウトすると(私のテストでは.tgaイメージは0バイトをシークするだけなので違いはありません)、ピクセル 35 で予期しないファイルの終わり。ただし、ヘッダーは完全に正常に読み取られます。それは単なるデータです。

2 つの関数は、異なるコンパイラ/アーキテクチャに対して異なる方法で実装されていますか?

struct TGAHeader
{   
    char    idlength;
    char    colourmaptype;
    char    datatypecode;
    short   colourmaporigin;
    short   colourmaplength;
    char    colourmapdepth;
    short   x_origin;
    short   y_origin;
    short   width;
    short   height;
    char    bitsperpixel;
    char    imagedescriptor;
};    

bool read()
{
    printf("Reading TGA file...\n");

    header.idlength = fgetc(TGAFile);
    header.colourmaptype = fgetc(TGAFile);
    header.datatypecode = fgetc(TGAFile);
    fread(&header.colourmaporigin,2,1,TGAFile);
    fread(&header.colourmaplength,2,1,TGAFile);
    header.colourmapdepth = fgetc(TGAFile);
    fread(&header.x_origin,2,1,TGAFile);
    fread(&header.y_origin,2,1,TGAFile);
    fread(&header.width,2,1,TGAFile);
    fread(&header.height,2,1,TGAFile);
    header.bitsperpixel = fgetc(TGAFile);
    header.imagedescriptor = fgetc(TGAFile);

    printf("...TGA file has been read\n\n");
    printf("ID length:         %d\n",header.idlength);
    printf("Colourmap type:    %d\n",header.colourmaptype);
    printf("Image type:        %d\n",header.datatypecode);
    printf("Colour map offset: %d\n",header.colourmaporigin);
    printf("Colour map length: %d\n",header.colourmaplength);
    printf("Colour map depth:  %d\n",header.colourmapdepth);
    printf("X origin:          %d\n",header.x_origin);
    printf("Y origin:          %d\n",header.y_origin);
    printf("Width:             %d\n",header.width);
    printf("Height:            %d\n",header.height);
    printf("Bits per pixel:    %d\n",header.bitsperpixel);
    printf("Descriptor:        %d\n",header.imagedescriptor);

    bytesToRead = header.bitsperpixel / 8;

    if(!errCheck())
    {
        m_bLoaded = false;
        return false;
    }
    //set stream position indicator to the start of the data
    fseek(TGAFile,(header.idlength+(header.colourmaptype * header.colourmaplength)),SEEK_CUR);

    //allocate space to store data
    releaseTGAData();
    pixelData = new unsigned char*[header.width*header.height];
    for(int i=0;i<header.width*header.height;i++)
        pixelData[i] = new unsigned char[bytesToRead];

    for(int i=0;i<header.width * header.height;i++)
    {
        if (fread(pixelData[i],1,bytesToRead,TGAFile) != bytesToRead)
        {
            printf("Unexpected end of file at pixel %d\n",i);
            m_bLoaded = false;
            releaseTGAData();
            return false;
        }
    }
    fclose(TGAFile);

    return true;
}

編集:これはロード機能です

bool load(const char* inFilename = NULL)
{
    m_bLoaded = false;
    if(NULL!=filename)
        delete [] filename;
    filename = new char[128];

    //if the filename has not been selected by the programmer
    if(NULL==inFilename)
    {
        //ask the user for it
        printf("please enter the filename of an uncompressed TGA file:\n");
        scanf("%s", filename);
    }
    else sprintf(filename, inFilename);

    if ((TGAFile = fopen(filename,"r")) == NULL)
    {
        printf("File open failed, please try again\n");
        return false;
    }
    if(!read())
        return false;

    m_bLoaded=true;
    return true;
}
4

3 に答える 3

2

問題は、ファイルをテキスト モードで開くことです。Windows では、input 関数がバイト シーケンス0x0d 0x0a(Windows の改行シーケンス"\r\n") を 1 文字に変換します。

Windowsは、Windowsのファイルの終わり文字であるバイト(0x19私が思うに)もチェックする可能性が最も高いでしょう。CTRLZ

于 2013-01-27T19:41:04.033 に答える
1

"rb"ファイルにはバイナリデータが含まれているため、Windowsでの呼び出しでオープンモードとして使用する必要がありfopen()ます。Unixでは、bはオプションです(ただし、無害です)。したがって、コードを移植できるようにする場合は、両方のシステムで同じモードを使用してください。

を指定せずにWindowsでファイルを開くと、b「CRLF」マッピングが取得されます(したがって、キャリッジリターンの改行シーケンス"\r\n"は改行にマッピングされます"\n"。ここで、改行は改行の単なる別名です)。そして、最初のコントロールZバイトはファイルの終わりを示します。

于 2013-01-27T19:44:40.570 に答える
1

この問題は、非バイナリ ファイルが処理されるときに Windows がファイルからの読み取りを処理する方法が異なることが原因である可能性が最も高いですが、より効率的な解決策は、ヘッダー構造体に #pragma pack または属性(alligned(1)) を使用し、 1 回の fread 呼び出しでヘッダー全体

于 2013-01-27T19:42:06.577 に答える