我在C++中实现了一个自定义的词法分析器,当我试图读入空格时,ifstream不会将其读出。我使用>>逐个字符地读取,所有的空格都消失了。有没有办法让ifstream保留所有的空格并把它读给我听?我知道当读取整个字符串时,读取会在空格处停止,但我希望通过一个字符一个字符地读取,可以避免这种行为。
尝试:.get(),被许多答案推荐,但它具有与std::noskipws相同的效果,也就是说,我现在得到了所有的空格,但不是我用来分析一些构造的换行符。
下面是有问题的代码(扩展注释被截断)
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绝对不在其中-输入只是跳到输入文件中的下一行。
发布于 2011-07-21 21:28:16
我最终破解了Windows API,并使用它先将整个文件读取到缓冲区中,然后逐个字符地读取缓冲区。谢谢你们。
发布于 2011-07-21 18:50:39
有一个操纵器可以禁用空格跳过行为:
stream >> std::noskipws;发布于 2011-07-21 18:51:30
operator>>使用空格(空格、制表符、换行符)。使用yourstream.get()读取每个字符。
编辑:
注意:平台(Windows、Un*x、Mac)在换行符的编码上有所不同。它可以是'\n‘、'\r’或两者。它还取决于您如何打开文件流(文本或二进制)。
编辑(分析代码):
之后
while(input.get(current) && current != L'\n');
continue;如果未到达文件末尾,则current中将有一个\n。在此之后,您将继续执行最外面的while循环。在这里,下一行的第一个字符被读入current。这不是你想要的吗?
我尝试重现您的问题(使用char和cin,而不是wchar_t和wifstream):
//: 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字符以错误的字节结束时...
https://stackoverflow.com/questions/6774825
复制相似问题