为什么我感到越来越怪异的结果与istream的::得到(字符*,streamsize可N,焦炭DE​​LIM)?

StackOverflow https://stackoverflow.com/questions/1943481

  •  20-09-2019
  •  | 
  •  

我在一个文件中读取与类似的格式:

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,在前面。当我看到在文本文件中,这似乎是相同的格式,所有被正确读取的其他时间值。为什么偶尔添加一个空字符?而且有一个变通?

有帮助吗?

解决方案

您已经阅读一个空行,或者你正试图读到文件的结尾。

的第一个字符是\0,这表示字符串的结束。

之后的任何字符都保持原样存储。

其他提示

尝试此,看看..

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');
}

最有可能你在你的输入文件中的结尾逗号地方。或也许超过14空白字符行上的最后一个号码后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top