从文件中读取名字和姓氏

时间:2013-12-08 02:28:02

标签: c++

当我从名称中删除Jr.时尝试从文件中读取时,一切正常。如何使用此输入文件将姓氏读作Smith Jr.?我不能使用get line,因为它读取整行作为全名但是如何读取名称和姓氏与姓氏分开,而不是导致错误?

Intro To Computer Science c++
SAL 343
JHG 344
John Adams
111223333 100 87 93 90 90 89 91 
Willy Smith
222114444 90 73 67 -77 70 80 90 
Phil Jordan
777886666 100 80 70 -50 60 90 100

当我从输入文件中删除Jr.时,它会读取姓氏Smith,但当我将它作为Smith Jr.放置时,它不会将其作为姓氏读取并导致巨大的打印错误。我如何将姓氏读作Smith Jr.而不是删除它? 谢谢 这是我的阅读功能

void Read_Student(Student & Temp , ifstream & fin){

    fin >> Temp.FirstName >> Temp.LastName ;
    fin >> Temp.Id;
    fin >> Temp.Quiz;
    for (int i = 0 ; i < 6 ; i++)
        fin >> Temp.Test[i];
    fin.ignore(10,'\n');
}
int Read_List(Student & Temp,Student List[], int Max_Size)
{
    ifstream fin;
    int i = 0;

    if (Open_File(fin))
    {
        getline(fin, List[i].Course_Name);
        getline(fin, List[i].Course_Id);
        getline(fin, List[i].Course_Location);
        Read_Student(List[i],fin);
        while(!fin.eof())
        {
            i++ ;
            if (i > Max_Size){
                cout << "\nArray is full.\n" ;
                break;
            }
            Read_Student(List[i],fin);
        }
    }
    else
    {
        cout <<"\nBad file. Did not open. Program terminated.\n";
        exit(0);
    }
    return (i);
}

2 个答案:

答案 0 :(得分:1)

fin >> Temp.FirstName >> Temp.LastName;

operator>>(istream&, string&)会在遇到空格时立即停止提取。但是,您希望在Temp.LastName中保存该行的其余部分。在这种情况下,请改用std::getline

fin >> Temp.FirstName;
std::getline(fin, Temp.LastName);
fin >> Temp.Id;
/* ... snip ... */

答案 1 :(得分:0)

似乎您想将第一个单词视为名字,其余单词作为姓氏。如果是这种情况,你可以使用getline来获取整行,然后砍掉一行(我可能会推荐一个字符串流来解析各个单词)。

或者,如果您希望能够解析多个单词的名字和姓氏,可以尝试在名字和名字之间添加一些“分隔符” - 就像逗号一样。您可以再次使用getline获取整行,然后使用逗号分隔名称。