【问题标题】:Read string one char at a time until end of line or file一次读取一个字符的字符串,直到行尾或文件结束
【发布时间】:2016-04-25 15:04:30
【问题描述】:

所以,我需要从stdin逐字符读取几行数字;也就是说,在每个字符读取之后,我需要对其做一些事情,只有在那之后我才能读取另一个;我还需要知道线路何时结束,另一条线路何时开始。这些数字是换行符分隔的,我对此没有问题;但是在最后一个字符串之后没有\n,所以我在确定何时停止读取最后一行时遇到了问题。我觉得自己真的很愚蠢,但谷歌搜索根本没有帮助我。我认为它应该是这样的:

char b;
for (size_t i = 0; i!= N; ++i) {
    while (some_mysterious_condition) {
        std::cin >> b;
        //so on
    }

我不知道我应该在那里放置什么条件。我试过使用std::cin.get(b),但它似乎忽略了换行符。

【问题讨论】:

  • getline 满足您的需求。
  • 最后一个字符串后面是什么?默认情况下 cin 考虑所有空格,包括 EOF.as deliminator。顺便说一句,您要解决什么问题?如果您想读取字符串,为什么要将数据读取到字符中?
  • @bashrc 什么都没有,文件到此结束。而且,如果您真的必须知道,尽管这与所讨论的主题无关,但我正在逐位阅读 BigInteger 数字
  • 要一次读取一个字符的行,使用 getline 读取,将行加载到 std::istringstream 并从中读取。这样您就可以逐行阅读并阅读所有字符。
  • 那么使用read 并自己解释所有字符可能会有所帮助。但请记住,代码总是难以维护且更容易出错。

标签: c++ input char


【解决方案1】:

根据您的 cmets,您似乎需要读取字符?

char b;
for (size_t i = 0; i!= N; ++i) {
    while (some_mysterious_condition && std::cin >> b) {

        //so on
    }

cin 在遇到 EOF(表示文件/流结束的字符)时会返回 false。

【讨论】:

    【解决方案2】:

    你能不能只检查最后一个字符读取的值是否等于'\0'然后break?

    编辑:

    然后是这样的:

    char b;
    
    for (;;) {
        for (;;)
        {
            b = std::cin.get();
            if ((b == '\0') || (b == '\n')) {
                //new line or end of file was found, skip handling that character
                break;
            }
             //do something with char b
        }
    
        if (b == '\0') break; //exit outer loop if end of file detected
    
    }
    

    【讨论】:

    • “我尝试过使用 std::cin.get(b),但它似乎忽略了换行符。”这是我设法正确捕捉文件结尾的唯一方法
    • 因此,您希望逐个字符地读取每一行,但要在沿途的每个点检测换行符或文件结尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2013-06-27
    相关资源
    最近更新 更多