3

我有一个包含多行无符号字符三元组的 txt 文件。数据来自 OpenCV BGR 图片,因此每个字节三元组都是一个 BGR 颜色值。

当我尝试读取文件时,我用 fgets() 读取的行在图片文件的三分之一之后是空的。这是我的代码:

    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。尽管如此,在文件的三分之一之后,我的行中只得到一个空白字符。

希望那足够清楚。提前致谢。

编辑:

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]);
        }
    }

编辑2:

这是我的文本文件: http ://www.2shared.com/document/SmLbhYzH/Datensatz.html 大小:6,15mb

EDIT3 我的 OpenCV 图像的图像数据只是一个字符数组,应该用 b0 g0 r0 b1 g1 r1 ...

定义如下: char *imageData;

4

4 回答 4

2

Using a code base very similar to yours I'm able to read the whole file:

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'm seeing you say this I get only one blank character in my line after a third of the file and then I'm wondering...

Are you verifying that the characters are read correctly by looking at the file? You know you have non-displayable characters in there correct?

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)

Second thought... is your array index access correct? I'm not sure what widthStep is set to, but it could cause problems:

if FrontTexture->widthStep == 1, and x == 0 and 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]

Then on the next iteration: if FrontTexture->widthStep == 1, and x == 0 and 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]

Have you tried printing out a few steps to verify everything's working as you expect?

于 2012-11-09T13:16:35.280 回答
2

您需要检查这些函数的返回值。请参阅fgetssscanf。这些返回值很重要,会告诉你哪里出了问题。

于 2012-11-09T11:35:23.623 回答
1

利用:

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

注意字符串开头的空格。这将避免将空白读取为有效的第一个字符。

于 2012-11-09T11:29:00.680 回答
1

我们真的需要查看输入文件的样本。然而,有许多问题。

fgets 最多读取 10 个字符,如果一行是 11 个字符,那么第一次调用将读取其中的 10 个,第二个调用将读取剩余的一个。您还应该测试 fgets 返回的内容,并且为了更加安全, sscanf 返回 3 - 它匹配的事物的数量。直接调用 fscanf 可能会更好,避免使用 fgets

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

因为这样可以更好地处理空间。

于 2012-11-09T11:32:53.480 回答