从c ++中读取文件时如何忽略错误数据?

时间:2011-03-09 19:36:33

标签: c++ file ignore

更具体地说,我得到了这样的意见:

Mo  17 30   15  
Sa  9 00    30  
Tu  3 30    45  
Sq    
Fr  21 01   60

这些字母代表星期几,数字表示时间(军事时间)和通话时长(以分钟为单位)。

只要输入了有效数据,代码就能完美运行,但是,就像在这种情况下,当进入Sq时,循环会中断。到目前为止我的逻辑是什么

while(!instream.eof()){

        instream>>c1>>c2;
        day = checker(c1, c2);
        cout<<c1<<" "<<c2<<endl;

    if(day == 0){
        instream.ignore(100,'/n');
        instream>>c1>>c2;
        day = checker(c1, c2);
    }

instream是我的文件对象,c1和c2是char类型,函数'checker'检查字符以查看2的组合是否是一周中的有效日期。如果不是,则返回0.

据我所知,带有这些参数的instream.ignore最多会跳过100个字符,或直到找到新行。问题是,在此语句运行后,循环终止。 我也可能在那里有一些随机的couts或者流出,我只是检查一下。

这是完整的代码,以防我遗漏一些主要内容:

#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;

int checker(char a, char b);
void main(){
    ifstream instream;
    ofstream outstream;

    instream.open("infile.txt");
    outstream.open("outfile.txt");

    double cost = 0, realtime;
        int check = 0, day = 0, hour, min, time, i = 1;
    char c1, c2, c3;

    while(!instream.eof()){

        instream>>c1>>c2;
        day = checker(c1, c2);
        cout<<c1<<" "<<c2<<endl;

    if(day == 0){
        instream.ignore(100,'/n');
        instream>>c1>>c2;
        day = checker(c1, c2);
        }
    instream>>hour>>min>>time;
    realtime = 1.0*hour + min/60.0;

    if(day == 1 && (realtime < 7 || realtime > 21)){
        cost = 0.15 * time;
        outstream<<"The cost of call " << i << " is $" << cost <<endl;
        i++;
    }
    else if(day == 1 && (realtime >= 7 || realtime <= 21)){
        cost = 0.30 * time;
        outstream<<"The cost of call " << i << " is $" << cost <<endl;
        i++;
    }
    else if(day == 2){
        cost = 0.10 * time;
        outstream<<"The cost of call " << i << " is $" << cost <<endl;
        i++;
    }
    outstream<<" "<<hour<<endl;
        outstream<<" "<<min<<endl;
    outstream<<" "<<time<<endl;
    outstream<<" "<<i<<endl;
    }
    cout<<"The program has completed its task"<<endl;
    instream.close();
    outstream.close();

}
int checker(char a, char b){
    int day2 = 0;
    if(a == 'M' && b == 'o' || a == 'm'&& b == 'O' || a == 'm'&& b == 'o' || a == 'M'&& b == 'O'){
    day2 = 1;
    }

    else if(a == 'T'&& b == 'u' || a == 't'&& b == 'U' || a == 't'&& b == 'u' || a == 'T'&& b == 'u'){
    day2 = 1;
    }

    else if(a == 'W'&& b == 'e' || a == 'w'&& b == 'E' || a == 'w'&& b == 'e' || a == 'W'&& b == 'E'){
    day2 = 1;
    }

    else if(a == 'T'&& b == 'h' || a == 't'&& b == 'H' || a == 't'&& b == 'h' || a == 'T'&& b == 'H'){
    day2 = 1;
    }

    else if(a == 'F'&& b == 'r' || a == 'f'&& b == 'R' || a == 'f'&& b == 'r' || a == 'F'&& b == 'R'){
    day2 = 1;
    }

    else if((a == 'S'&& b == 'a') || (a == 's'&& b == 'A') || (a == 's'&& b == 'a') || (a == 'S'&& b == 'A')){
    day2 = 2;
    }
    else if((a == 'S'&& b == 'u') || (a == 's'&& b == 'U') || (a == 's'&& b == 'u') || (a == 'S'&& b == 'U')){
    day2 = 2;
    }
    else
    day2 = 0;

    return day2;
}

--939345676

编辑:感谢您的回复,我同意100%我应该将其作为一行阅读并解析字符串,但我目前正在进行必要的编程课程,而且我以前只有100%的材料,我把它全部放在java中,所以我对语法还不是很好,我们被告知我们只能使用已经在讲座中讨论过的函数/循环/方法(以防止作弊,我猜)。还有,'\ n'而不是'/ n'帮了大忙,哈哈谢谢!

另外,我抓到的第一件事是连续两天糟糕的错误..我把它改成了一个if / else结构,由'checker'返回0来控制所有糟糕的日子。

总结..这个网站让我像一个学校女孩一样傻笑......一个程序员社区比我帮助的要好得多

4 个答案:

答案 0 :(得分:2)

使用cin.getline代替整行作为字符串,然后解析字符串。

答案 1 :(得分:2)

你的循环中断的原因是这句话,

instream.ignore(100, '/ N');

这意味着“忽略100个字符或/ n以先到者为准”。因此,当你的程序跳过100个字符时,它会到达文件末尾,并且当eof()到达时你的循环就会中断。你也在为LINE END使用错误的字符。它不是“/ n”。它是“\ n”(反斜杠),并用C代码表示它,你必须写“\ n”。

但是你的算法需要相当大的改进。尝试阅读完整行,然后检查该行中的前两个字符是否有效。否则忽略该行。 还有你的检查功能。如果将两个字符转换为大写字母然后检查它们是否有效会更好,这样您就不必检查所有组合。当你将toupper()函数应用于“mo”或“Mo”或“mO”或“MO”时,结果将在所有情况下都是MO,然后你可以在1次检查中进行比较。

答案 2 :(得分:0)

您的逻辑的一个主要问题是,如果输入两个连续的糟糕日期,会发生什么?

我建议使用ignore,然后使用continue重试你的循环(而不是阅读日期并盲目地继续)。

答案 3 :(得分:0)

为什么不将它包装在“try / catch”块中?