extract>> 运算符在 C++ 中到底如何工作

2024-03-25

我是一名计算机科学专业的学生,​​因此对 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: test

谢谢本·沃伊特:)

尽管如此,该解决方案非常依赖于格式并且非常脆弱。如果任何行在“\n”之前有任何其他内容(例如空格或制表符),则代码将错过换行符。因此,使用 getline() 和 sstrings 的另一种解决方案要可靠得多。


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

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

总之:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

extract>> 运算符在 C++ 中到底如何工作 的相关文章

随机推荐

  • BlackBerry Simulator 中的图形加速错误

    当我在模拟器上运行任何程序时 它会打开并显示错误 图形加速错误 BlackBerry 9900 Simulator 检测到您当前的图形加速存在问题 设置 具有最新视频的 OpenGL 1 x 兼容显卡 图形加速需要驱动程序 请尝试较低的 通
  • 在 Android 中将原始文件移动到 SD 卡

    我有一个方法可以copy an Audio file from raw folder to SD card 需要两个输入 ressound ogg 音频原始文件 ID fName SD卡中原始文件的文件名 Updated public bo
  • iOS 16 中 List 中的嵌套 ScrollView + 可刷新的奇怪行为

    在我的 SwiftUI 应用程序中 我有一个带有嵌套 ScrollView 的列表 因为我已将 iPhone 更新到 iOS 16 所以主列表上的刷新有一个奇怪的行为 似乎每个ScrollView都有自己的刷新 问题是我在主列表上应用了 r
  • jQuery 从 select 获取值然后更改 div 的 css

    我一直在尝试使用这个例子 但我一生都无法让它发挥作用 从选择中更改 Div 的背景 https stackoverflow com questions 5764413 change background of div from select
  • 属性名称不同时如何指定映射规则

    我是 Automapper 框架的新手 我有一个域类和一个 DTO 类 如下所示 public class Employee public long Id get set public string Name get set public
  • 有没有办法从 vim 一次打开多个文件?

    当从命令行启动 vim 时 我可以这样做vim txt一次打开目录中的所有文本文件 出于某种原因 在 vim 内部尝试相同的操作 e txt 给出错误 E77 Too many file names vim 拒绝一次打开多个有什么原因吗 有
  • 在主查询中的一列中返回多个值

    我试图从表中查找相对信息 并将这些结果 以及其他不相关的结果 作为较大查询的一部分返回到一行中 我已经尝试使用这个示例 并针对我的数据进行了修改 如何在一列中返回多个值 T SQL https stackoverflow com quest
  • 检查 Laravel 中的请求数组是否为空

    我有一个动态生成的表单 它为我提供了一组输入 然而数组可能为空 那么 foreach 将失败 public function myfunction Request request if isset request do something
  • 如何使嵌入式 Elasticsearch 可通过 localhost:9200 访问

    我正在玩spring boot sample data elasticsearch https github com spring projects spring boot tree master spring boot samples s
  • 在 VS 2012 中部署 Visual Studio 插件

    我已经成功创建了 Visual Studio 插件 但是我很困惑如何在另一台计算机上部署这个插件 我已经浏览了 stackoverflow 的答案 但是我对此事没有明确的想法 您只需将 YourAddIn dll 和 YourAddIn A
  • 将函数指针设置为静态地址

    我正在将 DLL 注入另一个进程 并希望根据其地址 0x54315 调用该二进制文件中的函数 我怎样才能真正声明一个函数 然后将其设置到这个地址 define FUNC 0x54315 void myFuncPtr int main myF
  • UI 自动化 - 为另一个应用程序的文本框设置文本

    我有两种形式 当单击其中一个按钮时 我想打开另一个按钮并在其中填充一个文本框 我尝试使用下面的代码 但它给出了一个错误 指出 不支持的模式 这是我的代码 private void button1 Click object sender Ev
  • 找出长度为 N 的两个字符的所有可能组合

    我有两个角色 例如 a a b b 我需要找到这两个字符的所有可能组合 从而形成长度为 N 的字符串 例如 如果N 3 combinations aab aba baa abb bab bba aaa bbb 某些模块中有此功能吗 iter
  • 覆盖 Django 模型 __init__ 方法

    我的 Django 项目的 Ingredient 模型有一个IntegerField它声明该原料库存是否按重量 单位或窝数进行管理 虽然数据库有它的integervalue 我必须显示它的名称 我认为最好覆盖每个成分并设置其值 而不是覆盖
  • 清理我的 git 分支的开发功能

    我参加 git 聚会有点晚了 我有一个简单的问题 我的主分支上目前正在开发三个功能实验 这些功能可以称为postits auth and uploads 当我做git status在我的主分支上 我得到了 已更改但未更新 中约 10 个条目
  • iOS 14/Xcode 12.0.1 更新后 UIPickerView 渲染不正确

    有人注意到应用程序 UIPickerViews 中的文本渲染不正确 第一个字符被截断吗 我在多个设备上的应用程序的所有 UIPickerViews 中看到了这一点 在大多数情况下 您可以看到第一个字符的几个像素 我尝试过从手机中删除派生数据
  • 许多基于backbone.js 的框架在现实世界中的优点和缺点是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 希望有人可以分享他们对一些最新出现的backbone js 变体的经验 我在几个项目中对主干 下划线 需求有一些很好的经验 我希望下一步朝着复杂
  • 寻找在巨大的 Pandas Dataframe 中对行进行切片的最快方法

    我的程序需要根据一个巨大的 Pandas Dataframe 中的列值获取一行 响应时间至关重要 我使用最常见的方法来做到这一点 例如 df loc df id 500000 Per timeit在我的 Mac 上 对 100 万行的数据帧
  • 我的 @media 查询无法在移动设备上运行

    如果浏览器宽度小于五个图像 包括边距等 我试图允许每行保存五个图像的容器更改其宽度的大小 我添加了以下媒体查询 在台式计算机上浏览时一切正常 将浏览器大小调整为宽度小于 1080 像素 容器更改宽度且内容居中 但是 在移动设备 iPhone
  • extract>> 运算符在 C++ 中到底如何工作

    我是一名计算机科学专业的学生 因此对 C 语言 考虑到这是我使用这种语言的第一个学期 或编码方面没有太多经验 我被分配从文本文件中读取整数 其简单形式如下 19 3 2 9 14 4 5 9 10 3 这让我踏上了更好地理解 I O 操作符