getline截断第一个字符

getline truncating first character

本文关键字:字符 第一个 getline      更新时间:2023-10-16

我已经看了这里、这里和这里。我没有使用cin.ignore()。我对这段代码有两个问题,但将限制为一个问题。unsigned int int long";sID";应包含";020961797";但仅包含";20961797;

bool GPA::importStudents(string mapFileName, string setFileName)
{
long long int sID;
string sName;
string sAddress;
string sPhone;
stringstream ss;
string line;
int mline_count = 0;
int sline_count = 0;
double x;
int y;
ifstream map_file;
ifstream set_file;
map_file.open(mapFileName);
set_file.open(setFileName);
    if (map_file.is_open()){
    for (int i = 0; i < mline_count/4; i++){
        getline(map_file, line);
        ss << line;
        ss >> sID;
        getline(map_file, line);
        ss << line;
        ss >> sName;
        getline(map_file, line);
        ss << line;
        ss >> sAddress;
        getline(map_file, line);
        ss << line;
        ss >> sPhone;
        StudentInterface * SI = new Student(sID, sName, sAddress, sPhone);
        my_map.insert(std::pair<unsigned long long int, StudentInterface*>(sID, SI));
        //my_map.emplace(Student(sID, sName, sAddress, sPhone));
    }
}
}

以下是应该从中读取数据的文件的第一部分:

020961797

Joshua Cooper

0509 McCrooke Avenue,Columbus,California 52826

552-534-8671

sID实际上包含1001111111101101000000101b,因为它有一个数字表示。使用默认格式打印,它确实呈现为20961797。如果需要,可以通过操纵器setw(9)setfill(' ')强制前导0获取020961797

除非必须对该字段值执行算术运算,否则将其作为字符串处理可能更合适。

您不能使用int来存储前导零,您必须将sID存储为string,然后随时将其转换为数字。可以说,ID是一个标识符,而不是一个数字,你实际上不需要对它进行任何数学运算,所以string将是的理想解决方案

string sID = "020961797";
//For some reason you need the ID as a number
int idToInt = atoi(sID.c_str());

请注意,当您通过

转换int时,它不会保持前导零

数字类型包含数字,而不是数字的表示。"十"、"10"、"010"、"我的手指数"answers"IIIIIIIIII"都是同一数字的不同表示。如果要保留字符,请使用字符串。