我是一名计算机科学专业的学生,所以对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,要可靠得多。