fgets / scanf读取文件没有给出值

时间:2012-11-09 11:23:48

标签: c memory opencv

我有一个包含大量无符号字符三元组的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]);
        }
    }

EDIT2:

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

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

定义如下: char * imageData;

4 个答案:

答案 0 :(得分:2)

您需要检查这些函数的返回值。请参阅fgetssscanf。这些返回值很重要,并会告诉您事情的进展情况。

答案 1 :(得分: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)

第二个想法......你的数组索引访问是否正确?我不确定widthStep的设置是什么,但它可能会导致问题:

如果FrontTexture->widthStep == 1x == 0y == 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]

然后在下一次迭代中:如果FrontTexture->widthStep == 1x == 0y == 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]

您是否尝试过打印几步以验证一切正常?

答案 2 :(得分:1)

使用:

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

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

答案 3 :(得分:1)

我们需要真正看到输入文件的示例。但是有很多问题。

fgets最多可读取10个字符,如果一行是11个字符,则第一个调用将读取其中的10个,第二个调用将读取剩余的一个。 您还应该测试fgets返回的内容,以及sscanf返回的额外安全性3 - 它匹配的内容数量。 直接调用fscanf可能会更好,避免使用fgets

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

因为这会更好地处理空间。