Extract&>运算符在C++中究竟是如何工作的运算符、工作、Extract、amp

2023-09-03 11:15:24 作者:櫻花盛開的東京

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

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

19 3 -2 9 14 4
5 -9 -10 3
.
.
.
c语言 12大于12么,C语言第12课 讲解一些常见运算符的用法,以及逻辑运算符的 短路特性 ...

这让我踏上了更好地了解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修饰符,可用于更改默认行为。