extract >>运算符在C++中的确切运作方式

Gil*_*kel 5 c++ fstream iostream extract operators

我是一名计算机科学专业的学生,​​因此对C++语言没有太多经验(考虑到这是我使用这种语言的第一个学期)或编码.

我被赋予了一个从文本文件中读取整数的赋值,其形式为:

19 3 -2 9 14 4
5 -9 -10 3
.
.
.
Run Code Online (Sandbox Code Playgroud)

这让我更好地了解了I/O操作符,因为我需要使用此流做某些事情(呃).

我到处寻找,无法找到关于extract >>运算符如何在内部工作的简单解释.让我澄清一下我的问题:

我知道提取器>>运算符会提取一个连续元素,直到它到达空格,制表符或换行符.我试图弄清楚的是,指针(?)或读取位置(?)在提取元素之后会在哪里.它会被移除的元素的最后一个字符,还是被移除,因此消失了?它会出现在空格/制表符/'\n'字符本身吗?也许是下一个要素提取的开始?

我希望我很清楚.我缺乏所有适当的术语来更清楚地描述我的问题.


这就是我需要知道的原因:(如果有人想知道......)其中一个要求是分别对每行中的所有整数求和.我创建了一个循环来逐个提取所有整数,直到它到达文件的末尾.但是,我很快就了解到extract >>运算符忽略了空格/制表符/换行符.我想要尝试的是提取>>一个元素,然后使用inputFile.get()来获取空格/制表符/换行符.然后,如果它是换行符,那就做我要做的事情.这仅在流指针处于良好位置以便在最后一次提取>>之后提取空格/制表符/换行符时才有效.


在我之前的问题中,我尝试使用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 == '\n')               //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 == '\n') {
                        lineCounter++;
                        statFile << "The sum of line " << lineCounter
                        << " is: " << lineSum << endl;
                            lineSum = 0;
                }
        }
        .
        .
        .
Run Code Online (Sandbox Code Playgroud)

不考虑我的数值,表格是正确的!两个空格和'\n'都被捕获了: 测试

谢谢Ben Voigt :)

尽管如此,这种解决方案依赖于格式,非常脆弱.如果任何行在'\n'之前还有其他内容(如空格或制表符),则代码将错过换行符.因此,使用getline()和sstrings的另一种解决方案更加可靠.

Ben*_*igt 4

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

但这并不重要,因为您不负责跳过该空白。下一次提取将忽略空格,直到找到有效数据。

总之:

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

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