首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ifstream读取不会读取空格

从ifstream读取不会读取空格
EN

Stack Overflow用户
提问于 2011-07-21 18:47:26
回答 8查看 56.3K关注 0票数 29

我在C++中实现了一个自定义的词法分析器,当我试图读入空格时,ifstream不会将其读出。我使用>>逐个字符地读取,所有的空格都消失了。有没有办法让ifstream保留所有的空格并把它读给我听?我知道当读取整个字符串时,读取会在空格处停止,但我希望通过一个字符一个字符地读取,可以避免这种行为。

尝试:.get(),被许多答案推荐,但它具有与std::noskipws相同的效果,也就是说,我现在得到了所有的空格,但不是我用来分析一些构造的换行符。

下面是有问题的代码(扩展注释被截断)

代码语言:javascript
复制
while(input >> current) {
    always_next_struct val = always_next_struct(next);
    if (current == L' ' || current == L'\n' || current == L'\t' || current == L'\r') {
        continue;
    }
    if (current == L'/') {
        input >> current;
        if (current == L'/') {
            // explicitly empty while loop
            while(input.get(current) && current != L'\n');
            continue;
        }

我从while行开始,查看传入的current的每个值,而\r\n绝对不在其中-输入只是跳到输入文件中的下一行。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-07-21 21:28:16

我最终破解了Windows API,并使用它先将整个文件读取到缓冲区中,然后逐个字符地读取缓冲区。谢谢你们。

票数 -4
EN

Stack Overflow用户

发布于 2011-07-21 18:50:39

有一个操纵器可以禁用空格跳过行为:

代码语言:javascript
复制
stream >> std::noskipws;
票数 28
EN

Stack Overflow用户

发布于 2011-07-21 18:51:30

operator>>使用空格(空格、制表符、换行符)。使用yourstream.get()读取每个字符。

编辑:

注意:平台(Windows、Un*x、Mac)在换行符的编码上有所不同。它可以是'\n‘、'\r’或两者。它还取决于您如何打开文件流(文本或二进制)。

编辑(分析代码):

之后

代码语言:javascript
复制
  while(input.get(current) && current != L'\n');
  continue;

如果未到达文件末尾,则current中将有一个\n。在此之后,您将继续执行最外面的while循环。在这里,下一行的第一个字符被读入current。这不是你想要的吗?

我尝试重现您的问题(使用charcin,而不是wchar_twifstream):

代码语言:javascript
复制
//: get.cpp : compile, then run: get < get.cpp

#include <iostream>

int main()
{
  char c;

  while (std::cin.get(c))
  {
    if (c == '/') 
    { 
      char last = c; 
      if (std::cin.get(c) && c == '/')
      {
        // std::cout << "Read to EOL\n";
        while(std::cin.get(c) && c != '\n'); // this comment will be skipped
        // std::cout << "go to next line\n";
        std::cin.putback(c);
        continue;
      }
     else { std::cin.putback(c); c = last; }
    }
    std::cout << c;
  }
  return 0;
}

此程序应用于自身,会消除其输出中的所有C++行注释。内部的while循环不会吃掉文件末尾的所有文本。请注意putback(c)语句。否则,换行符将不会出现。

如果它对wifstream不起作用,那将非常奇怪,除了一个原因:当打开的文本文件没有保存为16位字符,并且\n字符以错误的字节结束时...

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6774825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档