2013-11-24 48 views
0

我正在为游戏创建ASCII艺术,并且我的fstream未在我的if语句中接收'\n'(使用char)从流中删除。似乎很简单,但我现在很困惑。任何线索?我无法识别我的if语句中的endl字符

void pic_maker(ifstream &Pic_file, string P_Name, int x, int y, int t) 
{ 
Pic_file.open(P_Name); 
int margin = 0; 
coordinate(x, y); 
char pic_info; 
Pic_File >> pic_info; 

while (!Pic_File.eof()) 
{ 
    while (pic_info == '?') 
    { 
     Pic_File >> pic_info; //ADDS SPACES TO IMAGE BY REPLACING ? 
     cout << " "; 
    } 
    if (pic_info == '0') //RETURNS TO NEW LINE 
    { 
     Pic_File >> pic_info; 
     y++; 
     coordinate(x, y); 
    } 
    if (pic_info == '\n') //MY PROBLEM! DOESN'T RECOGNIZE \n 
    { 
     Pic_File >> pic_info; 
    } 
    cout << pic_info; 
    Pic_file >> pic_info; 
} 

Sleep(t); 
} 

回答

6

AFAIR >>操作符默认跳过换行符。如果您还想阅读空格,则应在读取字符之前添加noskipws

Pic_File >> std::noskipws; 
+0

谢谢!这节省了很多我试图解决的问题和更多! – Dljcali

0

格式化的输入运算符跳过前导空白。清除流的格式标记std::ios_base::skipws(例如使用std::noskipws操纵器)可以避免这种空白跳过。

我宁愿使用未格式化的输入操作,例如std::istream::get()成员之一或std::getline()

+0

谢谢.. getline()可能更有效率。还有一个问题。为了简化我的函数过程,我想通过引用fstream函数.open(“blah”)来调用一个字符串,通过我的函数名称.void pic_maker(ifstream&Pic_file,字符串P_Name,int x,int y,int t)我使用Pic_file.open(P_Name)? – Dljcali

+0

@ user3027652:'std :: string's是对象并且不被调用。但是,你的问题是什么?我忘了提及的一些东西:do ** not **使用'eof()'来控制你的输入循环!这是行不通的!相反,使用流转换为'bool'来测试输入成功后的输入。 –

+0

如果你使用的是C++ 11之前的库,你需要从'std :: string'对象中得到一个C字符串:'str.c_str()' –