[visual-studio]避免在 c + + 中使用 eof istream

标签: Visual-Studio
发布时间: 2014/3/1 4:00:14
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想避免使用 eof istream 在我的代码的假设来处理文本的文件,有关原因请参阅详细信息在这里

下面的代码尝试读取每一行,但是每一步代码读取而不是一个两行。

显然 getline 函数执行两次,和读取数据到 buf 首先之前正在处理由 strtok_s 函数。

如果我要去忽略内部 getline 指令如何写入数据到 buf[] 要处理?

while (getline(fin, line))
//while(!fin.eof())
 {
    // read an entire line into memory
    char buf[MAX_CHARS_PER_LINE];
    fin.getline(buf, MAX_CHARS_PER_LINE);

    // parse the line into blank-delimited tokens
    int n = 0; // a for-loop index
    int s = 0;
    // array to store memory addresses of the tokens in buf
    const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    char *next_token;
    // parse the line
    token[0] = strtok_s(buf, DELIMITER, &next_token); // first token
    if (token[0]) // zero if line is blank
    {
        for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
        {
            token[n] = strtok_s(0, DELIMITER, &next_token); 

            if (!token[n]) break; // no more tokens
        }
    }

    // process (print) the tokens
    for (int i = 0; i < n; i++) // n = #of tokens
        cout << "Token[" << i << "] = " << token[i] << endl;
    cout << endl;
}

fin.clear();
fin.close();

解决方法 1:

你不需要第二个电话的 getline: 在您的处置已有内容,它里面的行变量。所有您需要其内容出来为进一步标记化。这并不难做: 你需要做的就是 c_str 呼吁行变量,像这样:

char *buf = line.c_str();
官方微信
官方QQ群
31647020