【问题标题】:why reading one character from the file using char variable eating one more next character?为什么使用 char 变量从文件中读取一个字符又吃下一个字符?
【发布时间】:2018-05-09 19:06:34
【问题描述】:

在下面的程序中,我正在输入数据表单文件,

文件包含:第一行:答案键,后续行包含学生 ID 和他们的答案。

在程序中,我比较答案键和学生响应键并计算成绩和分数。

在读取 id 后,我需要丢弃 id 后面的空格,因为我需要读取一个字符,但是在使用 char 变量从文件中读取一个字符时,它正在读取空间,但也吃掉了下一个字符,所以我离开了学生答案键长度为 9 个字符,但应为 10 个字符。

int main() 中包含显示功能的 while 循环应该只运行一次,因为我在文件中只有一条记录,但它运行了 2 次。

这有什么问题?

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;
class student{
    string ans,usn;
    int marks,tot;
    char grade;
    public:
    void input(string key,fstream &fp){
        char ch;
        marks=tot=0;
        grade='z';
        fp>>usn>>ch;
        getline(fp,ans);
        string::iterator it1,it2;
        for(it1=key.begin(),it2=ans.begin()+1;it1!=key.end();++it1,++it2){
            tot+=2;
            if(*it1==*it2)
                marks+=2;
            else if(*it1!=*it2&&*it2!=' ');
                //marks-=1;
        }
        grade=marks<0?'z':(75-(marks*10/tot));
    }
    void display(){
        cout<<left<<setw(20)<<usn<<setw(20)<<ans<<setw(10)<<marks<<setw(10)<<grade<<ans.length()<<" "<<tot<<endl;
    }
};
int main(){
    student s;
    string key;
    char ch;
    fstream fp("file.txt");
    if(!fp){
        cout<<"\nError in opening file"<<endl;
        exit(0);
    }
    getline(fp,key);
    cout<<left<<"key:"<<key<<endl<<setw(20)<<"usn"<<setw(20)<<"Answer key"<<setw(10)<<"marks"<<setw(10)<<"grade"<<endl<<setfill('-')<<setw(60)<<"-"<<setfill(' ')<<endl;
    while(!fp.eof()){
        s.input(key,fp);
        s.display();
    }
    fp.close();
    return 0;
}

文件:

TTTTTTTTTT
1rv16is089 FTTTTTTTTT

输出:

key:TTTTTTTTTT
usn                 Answer key          marks     grade     
------------------------------------------------------------
1rv16is089          TTTTTTTTT           16        C         9 20
1rv16is089          TTTTTTTTT           16        C         9 20

【问题讨论】:

  • 我想是时候你了learn how to debug your programs
  • 对不起,但是什么都试过了,可是为什么char会吃掉2个字符呢?
  • char 不吃 2 个字符!
  • @Rahul 你说你不能调试是什么意思?调试是每个人都在他们的代码中发现错误的行为。如果您不知道如何 - 建议您学习它,这是任何开发人员的基本技能。

标签: c++ string file char


【解决方案1】:

除非您明确要求流不要 (noskipws),标准库中的所有operator&gt;&gt; 将在开始读取其输入之前自动跳过所有前导空格。

所以您的fp &gt;&gt; ch首先跳过所有空格,然后然后再读取一个字符。

有一个特殊的操纵器std::ws 可以用来吃空白,但不能吃其他东西。只需fp &gt;&gt; std::ws;

但是,您还有其他一些问题。在混合&gt;&gt;std::getline 时,您可能会考虑这一点,这可能是您试图解决的基本问题:

Why does std::getline() skip input after a formatted extraction?

这里解释了您对main() 似乎阅读了太多一条记录的问题:

Why is iostream::eof inside a loop condition considered wrong?

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2013-02-01
    • 1970-01-01
    • 2012-07-20
    • 2012-04-08
    • 2013-06-27
    相关资源
    最近更新 更多