2013-02-25 64 views
0

我試圖逐行讀取文本文件並打印前17個字符。無法讀取文件中的字符串c

FILE *devices; 
devices = NULL; 
devices = fopen("devices.txt", "r"); 

char deviceaddr[17]; 
char addr[17]; 

char line[1024]; 

while (fgets(line,1024,devices) != NULL) 
{ 
    fscanf(devices,"%s", deviceaddr); 

    printf("%s\n", deviceaddr); 
} 

fclose(devices); 

輸出應該是00:07:80:4C:0E:EE的第一線,但它給6

+0

你確定你的意思是C++嗎?這是純粹的C. – 2013-02-25 15:13:27

+0

這比C++多得多。 C++將使用'std :: ifstream',使用'while(std :: getline)'讀取,並使用'.substr()'獲取前17個字符。 – chris 2013-02-25 15:13:34

+1

使用固定大小的數組時,不要忘記尾部'\ 0'。 – 2013-02-25 15:13:56

回答

1

有沒有辦法輸出可以是"00:07:80:4c:0E:EE",因爲 這將導致不確定的行爲,由於緩衝器 溢出—字符串需要18個字節,但是你只提供 17.你應該從未我們"%s" in fscanf without 指定長度。

你在從 中讀取一行後,在devices上調用fscanf;如果您正在逐行閱讀,您想要使用您閱讀過的行上的 sscanf

3

while循環正在讀取一行文本,然後fscanf將讀取下一組文本(並可能偶爾溢出該緩衝區)。看起來好像你應該從緩衝區line中打印循環內的所需數據。

例如,假設有三行文本。

00:07:80:4C:0E:EE --> ends up line buffer line 
second    --> ends up in deviceaddr 
third line   --> ends up in line (unless the fscanf did not consume newline)  
+0

我正在嘗試逐行閱讀。此代碼用於從文件中讀取整數而不是字符串。 – SamuelNLP 2013-02-25 15:17:52

+1

如果它使用相同的邏輯(fgets後跟fscanf),那麼肯定會跳過第一行文本。如果fscanf不使用換行符,那麼每次fscanf調用後,fgets都會有效地讀取換行符。因此,除了「丟棄」第一行之外,它可能「按需要」工作。 – 2013-02-25 15:27:28