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
修饰符,可用于更改默认行为。
相关文章