Extract&>运算符在C++中究竟是如何工作的 [英] How exactly does the extract>> operator works in C++

查看:0
本文介绍了Extract&>运算符在C++中究竟是如何工作的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名计算机科学专业的学生,所以对C++语言(考虑到这是我使用C++语言的第一个学期)或编码方面没有太多经验。

我接到一个任务,要从一个简单形式的文本文件中读取整数:

19 3 -2 9 14 4
5 -9 -10 3
.
.
.

这让我踏上了更好地了解I/O操作符的旅程,因为我需要对此流(DUH)执行某些操作。

我到处找,都找不到关于Extract>>运算符如何在内部工作的简单解释。让我澄清我的问题:

我知道EXTRACTOR>>操作符将提取一个连续元素,直到它到达空格、制表符或换行符。我试图弄清楚的是,指针(?)或读取位置(?)是在它提取一个元素之后。它是在刚刚删除的元素的最后一个字符上,还是被删除并因此消失了?会在空白处/标签上/‘ ‘角色本身?也许是要提取的下一个元素的开始?

我希望我说得够清楚了。我缺乏所有合适的术语来更清楚地描述我的问题。


以下是我需要知道的原因:(以防有人想知道...) 其中一个要求是将每行中的所有整数分别求和。 我已经创建了一个循环来逐个提取所有整数,直到它到达文件的末尾。然而,我很快就了解到,提取>>操作符忽略了空格/制表符/换行符。我想尝试的是提取一个>>元素,然后使用inputFile.get()获得空格/制表符/换行符。如果是新台词,那就照我说的做。 仅当流指针在上次提取后位于合适的位置以提取空格/制表符/换行符>>时,此操作才有效。


In my previous question,我尝试使用getline()和sstring来解决它。


解决方案:

为了回答我具体的操作员如何工作的问题,我不得不接受Ben Voigt的回答是最好的。 我已经使用了这里建议的其他解决方案(对每行使用sstring),它们确实奏效了!(您可以在我上一个问题的链接中看到)但是,我使用Ben的答案实现了另一个解决方案,它也有效:

        .
        .
        .

if(readFile.is_open()) {
        while (readFile >> newInput) {
                char isNewLine = readFile.get();    //get() the next char after extraction

                if(isNewLine == '
')               //This is just a test!
                        cout << isNewLine;          //If it's a newline, feed a newline.
                else
                        cout << "X" << isNewLine;   //Else, show X & feed a space or tab

                lineSum += newInput;
                allSum += newInput;
                intCounter++;
                minInt = min(minInt, newInput);
                maxInt = max(maxInt, newInput);

                if(isNewLine == '
') {
                        lineCounter++;
                        statFile << "The sum of line " << lineCounter
                        << " is: " << lineSum << endl;
                            lineSum = 0;
                }
        }
        .
        .
        .

不考虑我的数值,表格是正确的!空格和‘ 被抓到的有:

谢谢Ben Voigt:)

尽管如此,此解决方案非常依赖于格式,并且非常脆弱。如果其中任何一行之前有任何其他事情 ‘(如空格或制表符),代码将缺少换行符。因此,另一种解决方案,使用getline()和sstring,要可靠得多。

推荐答案

提取后,流指针将放置在导致提取终止的空格(或其他非法字符,在这种情况下还将设置失败位)。

这并不重要,因为跳过那个空格并不是您的责任。下一次提取将忽略空格,直到找到有效数据。

小结:

  • 前导空格被忽略
  • 流中保留尾随空格

还有noskipws修饰符,可用于更改默认行为。

这篇关于Extract&>运算符在C++中究竟是如何工作的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆