2013-03-14 2 views
1

У меня есть файл:Использование GetLine разделить строку и проверить Int

name1 8 
name2 27 
name3 6 

и я разбор его в вектор. Это мой код:

int i=0; 
    vector<Student> stud; 

    string line; 
    ifstream myfile1(myfile); 
    if (!myfile1.is_open()) {return false;} 
    else { 
    while(getline(myfile1, line)) { 
     istringstream iss(line); 
     stud.push_back(Student()); 
     iss >> stud[i].Name >> stud[i].Grade1; 
     i++; 
    } 
    myfile1.close(); 
    } 

Мне нужно проверить, нет ли шпильки [i] .Grade1. Если он не возвращает false. Файл может содержать:

name1 haha 
name2 27 
name3 6 

Как я могу это сделать?

EDIT:

Я попробовал другой путь (без GetLine) и, кажется, работает. Я не понимаю, почему:/

int i=0; 
vector<Student> stud; 

ifstream myfile1(myfile); 
if (!myfile1.is_open()) {return false;} 
else { 
    stud.push_back(Student()); 
    while(myfile1 >> stud[i].Name) { 
    if(!(myfile1 >> stud[i].Points1)) return false; 
    i++; 
    stud.push_back(Student()); 
} 
myfile1.close(); 
} 
+0

http://stackoverflow.com/questions/2844817/how-do-i-check-if-ac-string-is-an-int –

ответ

1

Если тип Grade1 в числовом, таких как int, используйте std::istringstream::fail():

// ... 
    while(getline(myfile1, line)) { 
     istringstream iss(line); 
     stud.push_back(Student()); 
     iss >> stud[i].Name; 
     iss >> stud[i].Grade1; 
     if (iss.fail()) 
     return false; 
     i++; 
    } 
    myfile1.close(); 
    } 
// ... 
+0

Я пробовал это раньше, но он всегда возвращается ложный. Даже если есть цифры. – user2171413

+0

Какой тип 'Grade1'? – deepmax

+0

Это int. Код структуры: struct Student { string Имя; int Grade1, Grade2; // Студент (имя строки, int grade1, int grade2); }; – user2171413

1

Это может выглядеть следующим образом:

std::vector<Student> students; 
std::ifstream myfile1(myfile); 
if (!myfile1.is_open()) 
    return false; 

std::string line; 
while (std::getline(myfile1, line)) 
{ 
    // skip empty lines: 
    if (line.empty()) continue; 

    Student s; 
    std::istringstream iss(line); 
    if (!(iss >> s.Name)) 
     return false; 
    if (!(iss >> s.Grade1)) 
     return false; 

    students.push_back(s); 
} 

просто примечание что iss >> s.Grade1 будет успешным не только для десятичных, но и для восьмеричных и шестнадцатеричных чисел. Чтобы убедиться, что будет прочитано только десятичное значение, вы можете прочитать его во временном объекте std::string и проверить его, прежде чем использовать его для извлечения номера. Посмотрите на How to determine if a string is a number with C++?

Смежные вопросы