3

無署名の文字トリプルの多数の行を含む txt ファイルがあります。データは OpenCV BGR 画像から取得されるため、各バイト トリプルは BGR Color 値です。

ファイルを読み込もうとすると、fgets() で読み込んでいる行が、おそらく画像ファイルの 3 分の 1 後に空になります。私のコードは次のとおりです。

    FILE* DS;
    DS = fopen("Data.txt", "r");
    char line[100];
    for (int x=0; x<image->width; x++)
    {
        for (int y=0; y<image->height; y++)
        {
            fgets(line, 10, DS);
            sscanf(line, "%c %c %c", &FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 0], 
                                     &FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 1],
                                     &FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 2]);
        }
    }
    fclose(DS);

ファイルにアクセスして行 x*y を見たので、行が 3 文字で埋められていることは確かです。それにもかかわらず、ファイルの 3 分の 1 の後、行に空白文字が 1 つしかありません。

それが十分に明確であることを願っています。前もって感謝します。

編集:

txt ファイルの一部:

Z a `
Y ^ a
Z ` a
Y ^ a
Y _ `
Z ` a
Y a `
Z b a
V c a
X b a
V c a
V c a
V c a
V c a
T c a
T c a
S c a
S c a
R b `
R b `
U b `
W a `
W a `
Y a `
Z b a
[ b a
Z b a
[ c b
Y c b
Y c b

これは、次によってファイルに書き込まれました。

for (int x=0; x<image->width; x++)
    {
        for (int y=0; y<image->height; y++)
        {
            fprintf(DS, "%c %c %c\n",   FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 0], 
                                        FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 1], 
                                        FrontTexture->imageData[FrontTexture->widthStep * y + x * 3 + 2]);
        }
    }

EDIT2:

ここに私のテキストファイルがあります: http://www.2shared.com/document/SmLbhYzH/Datensatz.html サイズ: 6,15mb

EDIT3 私の OpenCV イメージのイメージ データは、b0 g0 r0 b1 g1 r1 で埋められるべき単なる文字配列です ...

次のように定義されます: char *imageData;

4

4 に答える 4

2

あなたのコードベースと非常によく似たコードベースを使用して、ファイル全体を読み取ることができます。

unsigned char a, b, c;

DS = fopen("/home/mike/win_share/Datensatz.txt", "r");
char line[100];
while(fgets(line, 10, DS) != NULL)
{
    sscanf(line, "%c %c %c", &a, &b, &c);
    printf("%c (%d) %c (%d) %c (%d)\n", a, a, b, b, c, c);
}

私はあなたがこれを言うのを見ていますI get only one blank character in my line after a third of the fileそしてそれから私は疑問に思っています...

ファイルを見て、文字が正しく読み取られていることを確認していますか?そこに表示できない文字が正しいことを知っていますか?

x (120) o (111) m (109)
{ (123) t (116) s (115)  <-- I'm guessing this is the last line that looks OK
  (127) u (117) w (119)  <-- (127) DEL char won't show
� (129) z (122) | (124)
� (131)   (127) � (128)

2番目の考え...配列インデックスへのアクセスは正しいですか?何widthStepが設定されているかわかりませんが、問題が発生する可能性があります。

の場合FrontTexture->widthStep == 1x == 0およびy == 0

[1 * 0 + 0 * 3 + 0] => [0 + 0 + 0] => [0]
[1 * 0 + 0 * 3 + 1] => [0 + 0 + 1] => [1]
[1 * 0 + 0 * 3 + 2] => [0 + 0 + 2] => [2]

次に、次の反復で:if FrontTexture->widthStep == 1x == 0およびy == 1

[1 * 1 + 0 * 3 + 0] => [1 + 0 + 0] => [1]  // Overwrite the data in imageData[1]
[1 * 1 + 0 * 3 + 1] => [1 + 0 + 1] => [2]  // Overwrite the data in imageData[2]
[1 * 1 + 0 * 3 + 2] => [1 + 0 + 2] => [3]

すべてが期待どおりに機能していることを確認するために、いくつかの手順を印刷してみましたか?

于 2012-11-09T13:16:35.280 に答える
2

これらの関数の戻り値を確認する必要があります。fgetsおよびsscanfを参照してください。これらの戻り値は重要であり、どこで問題が発生しているかがわかります。

于 2012-11-09T11:35:23.623 に答える
1

入力ファイルのサンプルを実際に見る必要があります。ただし、いくつかの問題があります。

fgets は最大 10 文字を読み取ります。1 行が 11 文字の場合、最初の呼び出しで 10 文字が読み取られ、2 回目の呼び出しで残りの 1 文字が読み取られます。また、fgets が返すものをテストする必要があります。また、安全性を高めるために、sscanf が 3 (一致したものの数) を返すことを確認する必要があります。fscanf への直接呼び出しは、fgets を避けて、より良いかもしれません

fscanf(DS, "%c %c %d", ...

スペースをより適切に処理するためです。

于 2012-11-09T11:32:53.480 に答える
1

使用する:

sscanf(line, " %c %c %c", ...

文字列の先頭のスペースに注意してください。これにより、空白を有効な最初の文字として読み取ることを回避できます。

于 2012-11-09T11:29:00.680 に答える