2012-11-09 24 views
3

我有一個包含無數個無符號字符三元組行的txt文件。數據來自OpenCV BGR圖片,所以每個字節的三倍是BGR顏色值。fgets/scanf讀取文件不給出任何值

當我嘗試讀取文件時,我正在用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

只是檢查我是否理解正確 - 該文件具有'x * y'行,並且每行都有三個數字? – SingerOfTheFall

+0

這實際上是C++嗎?如果不是,可能會失去標籤!不要以爲你想分享寬度和高度的值,並把Data.txt的內容扔到我們可以看到的地方? – Rook

+0

您確定此文件具有三元組作爲文本,而不是二進制值嗎?因爲您正在閱讀它們,就好像它們是文本一樣...... – rodrigo

回答

1

用途:

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

注意在字符串開頭的空格。這將避免將空白讀爲有效的第一個字符。

+0

是不是OPs問題'fgets'在一段時間後停止從文件獲取數據?我很困惑:S – SingerOfTheFall

+0

從描述中不太清楚......也許......在第二次閱讀時,現在我認爲該文件是二進制文件,並且正在閱讀它,就好像它是文本一樣。 – rodrigo

+0

我不認爲它是二進制的,因爲OP說:「我進入文件,看着行x * y」...這也是「Data.txt」,對我來說這意味着該文件已創建,應該訪問在文本模式下... – SingerOfTheFall

1

我們需要真正看到輸入文件的樣本。但是有一些問題。

fgets最多可以讀取10個字符,如果一行是11個字符,那麼第一個調用將讀取其中的10個,第二個讀取剩餘的一個。 您還應該測試fgets返回的結果,以及sscanf返回的額外安全性3 - 匹配的事物數量。 到的fscanf直接調用可能會更好,避免了與fgets

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

因爲這將更好地應對空間。

+0

由於'sscanf'調用只匹配5個字節的內容,所以看起來行*必須*長度不超過10個字符。不過,我想我們需要輸入代碼來查看是否有明顯的邏輯錯誤。 – Rook

+0

我想如果你使用_only_ fscanf,你可以在fscanf跳過空白時遇到麻煩,正如手冊頁所示:*一系列空格字符(空格,製表符,換行符等; 請參閱isspace 3))。這個指令可以匹配任意數量的空白,包括none,在輸入中。 –

2

您需要檢查這些函數的返回值。見fgetssscanf。那些返回值是重要的,並會告訴你事情發生了什麼地方。

+0

這是一個非常好的觀點(大多數人不會那麼做),但我想它應該是一個評論... – SingerOfTheFall

+0

@SingerOfTheFall - 這是一個解決方案由於文件格式不正確,可能導致問題。除此之外,使用返回值是一種很好的編程習慣 - 編寫規範/代碼的人員出於某種原因將它們放在那裏。 –

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] 

您是否嘗試過打印出幾個步驟來驗證所有工作正常?

+0

我正在填充的紋理僅保留1/3之後的空格,因爲某些字符沒有正確讀取。那對嗎?所以你說我也可以把它們看作整數(%d),後來又把它們看作字節? –

+0

不起作用,因爲我用fgets()獲得的行已經只有一個空格,其餘的被sscanf忽略。我不知道爲什麼你的fgets()爲你提供了正確的文件值,而我的不會。在fgets()之後,如果我調試並查看線,visual studio告訴我它只有一個空白字符串... –

+0

@MartinHennig - 我懷疑是這樣,但我需要看到你的'FrontTexture'結構來說確定它是否沒有正確存儲。我這裏的主要觀點是,通過'fgets()'和'sscanf()'以微不足道的方式讀取數據(如我的示例)工作正常。所以你讀數據的方式是可以的,但其他的東西是不對的。你可以發佈你的結構,以及你爲它做的任何分配/初始化嗎? – Mike