C++ 修改此函数以从';读取';分隔文件

C++ 修改此函数以从';读取';分隔文件,c++,function,delimiter,C++,Function,Delimiter,免责声明这是一个家庭作业问题。我并不是要求对我正在编写的程序有一个完整的解决方案,只是要求更好地理解正在发生的事情。提前谢谢 提供的函数正在从如下所示的文件中读取 foo;bar foo;bar 我想修改这个函数,从一个类似 foo;bar;foobar foo;bar;foobar void EntryList::loadfile(const char filefoo[]) { ifstream in; char foo[MAX_CHAR

免责声明这是一个家庭作业问题。我并不是要求对我正在编写的程序有一个完整的解决方案,只是要求更好地理解正在发生的事情。提前谢谢

提供的函数正在从如下所示的文件中读取

foo;bar
foo;bar
我想修改这个函数,从一个类似

foo;bar;foobar
foo;bar;foobar
void EntryList::loadfile(const char filefoo[])
{
    ifstream        in;
    char            foo[MAX_CHAR];
    char            bar[MAX_CHAR];
    AddressEntry    anEntry;    

    in.open (filefoo);
    if(!in)
    {
        in.clear();
        cerr << endl << "Fail to open " << filefoo << " for input!" << endl << endl;
        exit(1);
    }   

    in.get(foo, MAX_CHAR, ';');
    while (!in.eof())
    {
        in.get();                       //remove field seperator ';'            
        in.get(bar, MAX_CHAR, '\n');
        in.ignore(100, '\n');               //remove record seperator '\n'  

        anEntry.setfoo(foo);
        anEntry.setbar(bar);    

        addEntry(anEntry);  

        in.get(foo, MAX_CHAR, ';');             //start the next record
    }
    in.close();
}
提供的函数如下所示

foo;bar;foobar
foo;bar;foobar
void EntryList::loadfile(const char filefoo[])
{
    ifstream        in;
    char            foo[MAX_CHAR];
    char            bar[MAX_CHAR];
    AddressEntry    anEntry;    

    in.open (filefoo);
    if(!in)
    {
        in.clear();
        cerr << endl << "Fail to open " << filefoo << " for input!" << endl << endl;
        exit(1);
    }   

    in.get(foo, MAX_CHAR, ';');
    while (!in.eof())
    {
        in.get();                       //remove field seperator ';'            
        in.get(bar, MAX_CHAR, '\n');
        in.ignore(100, '\n');               //remove record seperator '\n'  

        anEntry.setfoo(foo);
        anEntry.setbar(bar);    

        addEntry(anEntry);  

        in.get(foo, MAX_CHAR, ';');             //start the next record
    }
    in.close();
}
void EntryList::loadfile(const char filefoo[])
{
如果输入;
char foo[MAX_char];
字符条[MAX_char];
地址输入入口;
in.open(filefoo);
如果(!in)
{
in.clear();

cerr原始函数和修改后的函数都是错误的:在尝试读取某个内容(我想,如果我最终去世,我的墓碑上会刻上该内容)之后,您总是需要检查输入是否成功
控制输入循环通常不起作用

如果该行以少于
MAX_CHAR
个字符的字符串结尾,则忽略下一行:需要检查输入是否以换行符结尾,如果不是,则忽略其余字符。如果最后一个输入以换行符结尾,则不希望忽略字符。此外,如果该行恰好以m结尾超过100个字符,它也不起作用。
std::istream::ignore()
忽略尽可能多的字符的神奇常量拼写为
std::numeric\u limits::max()
,并在标题
中声明

基本上,您的循环应该从

while (in.getline(foo, MAX_CHAR, ';')
         .getline(bar, MAX_CHAR, ';')
         .get(foobar, MAX_CHAR, '\n')) {
    if (foobar[in.gcount() - 1] == '\n') {
        foobar[in.gcount() - 1] = '\0';
    }
    else {
        in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    // process the inputs
}
while(在.getline(foo,MAX_CHAR,“;”)中)
.getline(条,最大字符';')
.get(foobar,MAX_CHAR,'\n')){
如果(foobar[in.gcount()-1]='\n'){
foobar[in.gcount()-1]='\0';
}
否则{
in.ignore(std::numeric_limits::max(),'\n');
}
//处理输入
}

代码对前两个组件使用
std::istream::getline()
,以避免存储分隔符:如果提取分隔符并停止输入就足够了。对于最后一个组件
std::istream::get()之所以使用
,是因为需要验证存储的最后一个字符是否为换行符。存储的最后一个字符是使用
std::istream::gcount()访问的
包含最后一个未格式化输入函数存储的字符数。由于输入成功,并且在存储换行符时或在存储
MAX_CHAR
字符后将停止,
in.gcount()-1
始终是一个有效的索引。但是,请注意,代码没有经过测试…

在.get()中执行
跳过第一个
。第二个呢?是的,你可能会理解一些让我困惑的东西。第一个实例是.get(foo,MAX_CHAR,;)
在提供的函数中没有意义,为什么它在while循环之外。它似乎有一些我不熟悉的副作用,当我考虑修改文件以使用第二个“;”作为分隔符时,真的让我不知所措。但我真的可以回答您的问题,因为提供的函数很混乱请在这里查看代码:谢谢你的输入。我读了很多关于为什么在.eof()中的内容,这有点令人沮丧是有问题的,但它是在课堂上教授的。你提供的代码对我来说似乎更易读,我可以看到程序上发生了什么。我还没有完成整个程序,所以我还不能报告。我会在周末前给你回复,并让你知道(和其他人)这是怎么回事。再次感谢你!@user2404155:请告诉你的老师,互联网上有个奇怪的家伙告诉他,他在做广告时教的是垃圾控制输入循环:我们希望未来的学生不受这种特殊的方法影响。在C++的IOFSURTS中,应该很容易地验证这个特殊的怪人有合理的凭证:一些谷歌搜索应该确认我在IoSoo流上是合理的知识,应该先阅读。尼科莱·约瑟蒂的《IcStand》的页面“C++ SunARD图书馆”。