2012-03-09 3 views
0

Я использую GetLine, чтобы захватить строки из файла входных данных, который выглядит, как этотИгнорирование символов Пробелы

1 9 
5 5 
6 7 
... 

Если первое число число братьев и сестер кого-то есть и второе число является чей-то возраст.

const int MAXLINE=50; 

int main(int argc, char *argv[]) { 

    int numberOfSiblings; 
    int age; 

    char oneline[MAXLINE]; 

    ifstream inputData; 
    inputData.open(argv[1]); 

    while (!(inputData.eof())) { 

     inputData.getline(oneline, MAXLINE); 

     numberOfSiblings = oneline[0] - '0'; 
     age = oneline[2]-'0'; 

    } 

} 

Howerver, я не могу предположить, что эти int всегда будут иметь один и тот же индекс из-за пробела.

Поскольку, если есть два пробела, а не один возраст, теперь будет в индексе 3. Как я могу объяснить это?

Кроме того, что произойдет, если у меня есть двузначное число?

+1

Возможный дубликат [Как разбить строку на C++?] (Http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c) – talnicolas

+3

Пожалуйста, прочитайте [Почему ' iostream :: eof' внутри условия цикла считается неправильным?] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Xeo

ответ

2

Пусть стандартный поток сделать это для вас:

inputData >> numberOfSiblings >> age; 
+0

Это замечательно и работает , но теперь это вызывает странную ошибку, когда последняя строка читается дважды по какой-то причине ... Любая идея почему? – DomX23

+0

@ DomX23 - потому что ваш входной контур неверен. Не используйте 'eof()' или 'good()' как условие цикла. Предпочитаю: 'while (inputData >> numberOfSiblings >> age) {/ * работа идет здесь * /}'. –

+0

Единственная причина, по которой я не могу этого сделать, - это то, что в первой строке я беру другой ввод int numberOfPeople, в то время как остальная часть файла данных содержит numberOfSiblings и возраст. Поэтому я делаю чек, чтобы увидеть, если мы находимся в строке 1, если так я захватил числоOfPeople, и если мы на линии> 1, я возьму остальных. Есть ли другой способ сделать это, а не использовать eof()? – DomX23

1

станд :: IStream уже operator>> пропустить через любой ведущие пробелы, а затем прочитать Int для вас. Кажется, это то, что вам нужно, поэтому я бы просто использовал его.

Если бы я делал это, я бы начал с структуры для представления данных одного человека:

struct data { 
    int num_siblings; 
    int age; 
}; 

Тогда я бы написать функцию, чтобы прочитать одну из этих пунктов:

std::istream &operator>>(std::istream &is, data &d) { 
    return is >> d.num_siblings >> d.age; 
} 

При этом, вы можете прочитать data элемент из потока с помощью operator>>:

std::ifstream input("people.txt"); 

data person; 
input >> person; 
0

Было много хороших ответов.

Но, я думаю, что если вы хотите использовать & выучить C++,

лучше использовать «< <» или «>>», чтобы помочь вам сделать вашу работу.

В ответах у них используется override operator, вы можете узнать от HERE || HERE.

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