我有一个包含大量无符号字符三元组的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;
答案 0 :(得分:2)
答案 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 == 1
,x == 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]
然后在下一次迭代中:如果FrontTexture->widthStep == 1
,x == 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]
您是否尝试过打印几步以验证一切正常?
答案 2 :(得分:1)
使用:
sscanf(line, " %c %c %c", ...
注意字符串开头的空格。这样可以避免将空白作为有效的第一个字符读取。
答案 3 :(得分:1)
我们需要真正看到输入文件的示例。但是有很多问题。
fgets最多可读取10个字符,如果一行是11个字符,则第一个调用将读取其中的10个,第二个调用将读取剩余的一个。 您还应该测试fgets返回的内容,以及sscanf返回的额外安全性3 - 它匹配的内容数量。 直接调用fscanf可能会更好,避免使用fgets
fscanf(DS, "%c %c %d", ...
因为这会更好地处理空间。