【问题标题】:How to Read last line of a delimited File如何读取分隔文件的最后一行
【发布时间】:2013-09-08 07:32:09
【问题描述】:

我有一个带有分号分隔符的分隔文件。 我正在使用以下代码来阅读最后一行。我相信循环一直运行到最后一行并不断覆盖 lastLine 字符串。所以一旦到达最后一行,循环就会中断,字符串就是最后一行。

while(getline(finlocal, chuy, ';'))
{
       getline(finlocal,lastLine, ';');
}

cout<<lastLine; //last line.

但是这种方法不能正常有效地工作。 关于如何知道这个分隔文件的最后一行的任何建议。

【问题讨论】:

  • 你的意思是,它不能正常工作?
  • it doesn't work properly 是什么意思??
  • 你是只对最后一行感兴趣还是全部都需要?

标签: c++


【解决方案1】:

你没有解释你的问题是什么,但我猜它不会检查每一行,因为循环内的 getline() 指向下一个元素,所以你丢失了一半的元素。

while(getline(finlocal, chuy, ';'))
{

}
std::cout<<chuy;

应该工作

假设这是你的台词:

1.;

2.;

3.;

4.;

...

在第一次迭代之后,它会:

1.;

2.;

3.;

4.;

...

所以你失去了第二个元素。循环一直到最后

5.;

结束。;

它不存在,所以在 getline() 内部不起作用

【讨论】:

    【解决方案2】:

    使用

    while(getline(finlocal, lastLine, ';'));
    cout<<lastLine;
    

    否则你可能不会得到最后一行。

    你可以使用

        while(getline(finlocal, lastLine, ';'))
        {
           getline(finlocal,lastLine, ';');
        }
        cout<<lastLine;
    

    但是getline 两次没有意义

    在你的情况下,为了更好的分隔符,我会使用一个特殊的符号,比如 do:

    char delimiter = 251;
    

    char 是平方根的符号,很可能不会在聊天中使用。不过,对于收到的每条聊天消息,您都需要检查该标志是否正在那里使用,如果是,则将其删除。现在对于您发送的每条消息,在其末尾加上符号发送,在接收时,在该字符处使用getline 分割。

    这样你就可以在一个你知道用户不会弄乱的地方轻松拆分。

    【讨论】:

    • 谢谢,代码工作正常,但有一个问题。我采取最后一行并在我拥有的另一个文件中找到它的位置。我使用以下代码:- while (getline(myfile, line, ';')) { ++number_of_lines; if(stricmp(lastLineLocal.c_str(),line.c_str())==0) { break; } } 它确实给出了一些行的值,但它似乎不正确。
    • @GPTBoss 首先,您应该编辑您的问题或打开一个新问题。其次,您的代码看起来不错。在比较时添加值的打印以更好地了解问题并发布 2
    • @GPTBoss 不用发,问题很明显。将 ++number_of_lines 放在 if(){..} 之后,它应该可以正常工作:)。您可能会得到右行旁边的行数,对吧?
    • @khajvah 这取决于他是如何启动 number_of_lines 的,但无论如何,这是一个不同的问题,因此应该有一个自己的问题......
    • @NoIdeaForName 我不认为这个问题将来会帮助其他人,所以如果他现在可以解决它,那么为此提出新问题是没有意义的。你的意思是他是如何启动 number_of_lines 的?我认为问题很明显,它在检查之前递增,所以即使找到正确的行,计数器也会递增并指向下一行。
    【解决方案3】:

    如果文件不是很大,您可以先将整个文件放在一个字符串中,然后使用string::find_last_of 查找分号的最后一个索引。然后打印从该索引到文件末尾的行。

    【讨论】:

    • 谢谢,代码工作正常,但有一个问题。我采取最后一行并在我拥有的另一个文件中找到它的位置。我使用以下代码:- while (getline(myfile, line, ';')) { ++number_of_lines; if(stricmp(lastLineLocal.c_str(),line.c_str())==0) { break; } } 它确实给出了一些行的值,但它似乎不正确。
    猜你喜欢
    • 2019-09-05
    • 2020-11-21
    • 2012-07-22
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多