getline截断第一个字符

时间:2015-12-02 06:49:57

标签: c++

我已查看hereherehere。我没有使用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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您无法使用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不会保持前导零

答案 2 :(得分:0)

数字类型包含数字,而不是数字的表示。 “十”,“10”,“010”,“我拥有的手指的数量”和“IIIIIIIIII”都是相同数字的不同表示。如果要保留字符,请使用字符串。