2009-12-22 22 views
0

我讀與類似格式的文件:類似於以下我怎麼得到奇怪的結果與istream :: get(char *,streamsize n,char delim)?

TIME, x, y, z 
00:00:00.000 , 1, 2 , 3 
00:00:00.001 , 2 , 3 , 4 

等,以及代碼:

std::ifstream& istream; 
char buffer[15]; 
double seconds, hours, mins; // initialised properly in real code 

// to read in first column 
istream.get(buffer, 14, ','); 

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds); 

它讀取的第一列適用於大部分的時間。但是,有時sscanf會失敗,當我使用Codegear調試器檢查緩衝區中的內容時,我發現它已經讀入\000:00:023。由於某種原因,它正在收集空字符,即\0。當我查看文本文件時,它看起來與正確讀入的所有其他時間值的格式相同。爲什麼偶爾會添加空字符?有沒有解決辦法?

回答

2

您已閱讀空白行,或者您正在嘗試讀取文件末尾。

第一個字符是\0,它表示字符串的結尾。

之後的任何字符都是未觸動的內存。

+0

但它只發生在我讀入的一些時間值和所有行的格式一致。那麼爲什麼它讀了一個空行? – Seth

+1

十六進制編輯器是否驗證文本文件中是否有空值?你在檢查istream.eof()嗎? istream.bad()? istream.fail()? –

+0

是的 - 它實際上正確讀取上次的值。但是,錯誤發生在下一個循環時,它會嘗試讀取文件的末尾。我很困惑,因爲調試器顯示緩衝區中最後一次讀取的值是在它前面的'\ 0'處。 – Seth

2

試試這個,看看..

ifstream inpfile("sample.txt"); 
char buffer[15]; 
inpfile.ignore(80, '\n'); 
while (!inpfile.eof()) 
{ 

    inpfile.get(buffer, 14, ','); 
    int hrs, mins; 
    double secs; 
    hrs = mins = secs = -1; 
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs); 
    cout << "hrs:" << hrs << "\t" 
     << "mins:" << mins << "\t" 
     << "secs:" << secs 
     << endl; 
    inpfile.ignore(80, '\n'); 
} 
0

最有可能你在你的輸入文件中的結尾逗號地方。或者在一行上的最後一個數字之後可能有超過14個字符的空格。