2015-07-09 3 views
2

У меня есть файл, который состоит из линий, которые выглядят следующим образом:Самый короткий способ прочитать эту строку?

Alice 60 30 75 
Bob 20 250 12 

Где имя и целые длины являются переменными. Каков самый короткий способ поместить имя в строку и целые числа в массив размером 3? Я сделал getline(), а затем вытолкнул первый символ до первого пробела в вектор char, передал в строку, затем сделал следующий символ пробелу, преобразованный с помощью atoi(), затем отправленный в массив и т. Д. Я чувствую, что есть вероятно, намного лучший способ?

Я попытался рекомендации линии это:

int main() { 
    ifstream infile("wheelgame.txt"); 
    string s; 
    vector<int> a(3); 

    while (cin >> s >> a[0] >> a[1] >> a[2]) 
    { 
     cout << "test"; 
    } 

    } 

Но я думаю, что я недоразумение? Так происходит вечно.

ответ

10

Более короткий путь

std::string s; 
std::vector<int> a(3); // or int a[3]; or std::array<int, 3> a; 
std::cin >> s >> a[0] >> a[1] >> a[2]; 

EDIT: Измените время цикла чтения из файла вместо стандартного ввода (т.е. CIN)

while (infile >> s >> a[0] >> a[1] >> a[2]) { 
    ... 
} 

Этот цикл не будет работать вечно.

+0

Вы получаете +1 за использование вектора вместо массива. Лучше использовать [std :: array] (http://en.cppreference.com/w/cpp/container/array), хотя, если вам не требуется повторная калибровка. – NathanOliver

+0

Спасибо, что выглядит намного лучше. Я вынужден использовать массив, потому что мне нужно передать его функции, которая принимает список [], но это все равно будет работать хорошо. Вы можете использовать getline() с этим? – Austin

+1

@AustinMW Вы всегда можете просто скопировать содержимое вектора в массив, если вам действительно нужно. –

2

Если строка является массивом символов, и вы не хотите использовать STL:

char str[MAX]; 
int a[3]; 
fscanf(file, "%s %d %d %d", str, &a[0], &a[1], &a[2]); 
Смежные вопросы