为什么我用istream :: get(char *,streamsize n,char delim)得到奇怪的结果?

时间:2009-12-22 00:20:20

标签: c++ c++builder ifstream

我正在阅读一个格式类似于:

的文件
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。当我查看文本文件时,它看起来与正确读取的所有其他时间值的格式相同。为什么偶尔会添加一个空字符?是否有解决方法?

3 个答案:

答案 0 :(得分:2)

您已阅读空白行,或者您正在尝试阅读文件的末尾。

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

之后的任何字符都是未受影响的记忆。

答案 1 :(得分: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');
}

答案 2 :(得分:0)

很可能你的输入文件中有一个尾随逗号。或者在一行的最后一个数字之后可能超过14个字符的空格。