我是一名计算机科学专业的学生,因此对 C++ 语言(考虑到这是我使用这种语言的第一个学期)或编码方面没有太多经验。
我被分配从文本文件中读取整数,其简单形式如下:
19 3 -2 9 14 4
5 -9 -10 3
.
.
.
这让我踏上了更好地理解 I/O 操作符的旅程,因为我需要用这个流做某些事情(废话。)
我到处寻找,但找不到关于 extract>> 运算符内部如何工作的简单解释。让我澄清我的问题:
我知道 extractor>> 运算符会提取一个连续元素,直到它遇到空格、制表符或换行符。我试图弄清楚的是,在提取元素之后指针(?)或读取位置(?)会在哪里。它会在刚刚删除的元素的最后一个字符上,还是被删除并因此消失了?它会在空格/制表符/'\n' 字符本身上吗?也许是下一个要提取的元素的开始?
我希望我说得足够清楚。我缺乏所有合适的术语来更清楚地描述我的问题。
这就是为什么我需要知道这一点:(如果有人想知道......)
要求之一是分别对每一行中的所有整数求和。
我创建了一个循环来一一提取所有整数,直到到达文件末尾。然而,我很快了解到 extract>> 运算符会忽略空格/制表符/换行符。我想尝试的是提取>>一个元素,然后使用 inputFile.get() 获取空格/制表符/换行符。然后,如果是换行符,就做我必须做的事情。
仅当流指针处于上次提取>>后提取空格/制表符/换行符的良好位置时,这才有效。
在我之前的问题中 https://stackoverflow.com/questions/26134028/not-getting-all-lines-from-a-text-file-when-using-getlin-in-c,我尝试使用 getline() 和字符串来解决它。
解决方案:
为了回答我的具体问题关于 Operator>> 的工作原理,我不得不接受 Ben Voigt 的答案作为最好的答案。
我已经使用了这里建议的其他解决方案(每行使用字符串)并且它们确实有效! (您可以在我上一个问题的链接中看到它)但是,我使用 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;
}
}
.
.
.
With no regards to my numerical values, the form is correct! Both spaces and '\n's were catched:
谢谢本·沃伊特:)
尽管如此,该解决方案非常依赖于格式并且非常脆弱。如果任何行在“\n”之前有任何其他内容(例如空格或制表符),则代码将错过换行符。因此,使用 getline() 和 sstrings 的另一种解决方案要可靠得多。