9

u_fgetfile から返されたハンドルを fseek/fread 関数に渡そうとしています。

アプリケーションをデバッグ ランタイム ライブラリ (/MTd /MDd) にリンクするとクラッシュは発生しませんが、静的バージョンにリンクすると、次の単純なコードがクラッシュします。

#include <stdio.h>
#include "unicode\ustdio.h"

int main()
{
    UFILE* file;
    file = u_fopen("C:\\test.txt","r",NULL,"UTF-8");
    fseek(u_fgetfile(file),3,SEEK_SET);
}

これは、ICU の公式ビルドと、Visual Studio 2012 でカスタム ビルドをビルドした場合の両方で発生します (デバッグまたはリリースでの ICU のビルドは問題ではありません)。

私が見つけた唯一のことは、FILE構造に不一致があるように見えることですが、実際にはわかりません。

編集:

この質問に報奨金を追加する一環として、再現プログラム (上記のコードと同じ) とソースとバイナリを含む icu の両方を含む完全に機能する VS2012 プロジェクトを次に示します。ここから入手してください: http://goo.gl/urTuU

4

4 に答える 4

0

最初の質問: C++11 の機能をコンパイルして使用することは可能ですか?

最初に、この種のコードを使用してファイル構造の内部を調べてみます。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{
    unsigned int size = sizeof(FILE);
    FILE* file = fopen("main.c", "r");
    unsigned int i = 0;
    unsigned char buffer[size];
    memcpy(buffer, file, size);
    printf("The %u bytes at address %p are: \n", size, file);
    for (i = 0; i < size; ++i) {
        printf("%02X ", (unsigned int)(buffer[i]));
        if ((i+1)%64 == 0) {
            printf("\n");
        }
    }
    printf("\n");
    fclose(file);
    return 0;
}

2 つの異なるファイルと、デバッグ ライブラリとスタティック ライブラリの両方について、 your で置き換え、関数をFILEyourで置き換えます。UFILEfopenu_fopen

ファイル構造のバイトが表示され、問題の場所について役立つ情報が得られるかもしれません。

于 2013-07-12T20:29:35.823 に答える