Использование нескольких экземпляров getline в C++

Я работаю над назначением класса для С++, и нам необходимо получить входные данные из текстового файла и присвоить эти значения массиву.... одно - это строка, второе - целое, а третье - двойное.

Мы только познакомились с массивами, и я еще ничего не знаю об указателях, связных списках или каких-либо более сложных вещах, поэтому я чувствую, что несколько ограничен в своих возможностях. Я работал весь день, пытаясь найти способ получить ввод из текстового файла и назначить его соответствующему массиву. Я пытался использовать getline для чтения входного файла и установить разделитель для разделения каждого фрагмента данных, но получаю сообщение об ошибке, когда пытаюсь использовать его более одного раза. Из того, что я прочитал, это связано с тем, как я перегружаю функцию, но не могу ее решить. Каждое объяснение, которое я читал об этом, выходит за рамки моего нынешнего уровня знакомства. Прямо сейчас я сосредоточен на этом фрагменте кода:

for (int i = 0; i < EMP_NUM; i++) // Get input from text file for names.
    getline(inFile, nameAr[i], '*');

for (int i = 0; i < EMP_NUM; i++) // Input for hours.
    getline(inFile, hoursAr[i], '*');

for (int i=0; i < EMP_NUM; i++) // Input for hourly rate.
    getline(inFile, hrateAr[i], '*');

Я пытаюсь использовать getline три раза и записать данные в три отдельных массива, а затем сделать с ними серию вычислений и вывести их в другой текстовый файл. Первый экземпляр getline не выдает никаких ошибок компилятора, но последние два делают. Я не совсем уверен в другом решении для передачи данных в мои массивы, поэтому я в недоумении. Любая помощь будет здорово!


person Strata    schedule 06.11.2010    source источник
comment
Мы вольны создавать входной файл по своему усмотрению, если он содержит все правильные данные. Я упорядочил его так, что он содержит три строки, одну с набором имен, другую с часами и третью с почасовыми ставками. Имена имеют инициалы и фамилию, за которыми следует звездочка, выступающая в качестве разделителя. Например: J. Doe* J. Doee* ..... Последние две строки представляют собой простые числа, разделенные пробелами. Я решил использовать разделитель с первой строкой, так как первый инициал и фамилия содержат символ пробела.   -  person Strata    schedule 06.11.2010


Ответы (3)


1) Вместо трех разных итераций используйте только одну

2) Передать строковый объект в getline вместо указателей

string buf;
for (int i = 0; i < EMP_NUM; i++) // Get input from text file for names.
{
    getline(inFile, buf, '*');
    nameAr[i] = buf;
    getline(inFile, buf, '*');  //assuming delimiter is again *
    hoursAr[i] = atoi(buf.c_str() );  //C way to doing it...however in c++ u have to use stringstreams....
    getline(inFile, buf);
    hrateAr[i] = atof(buf.c_str() );;
}
person jRJ    schedule 06.11.2010

Если я правильно понимаю, у вас просто есть три значения в файле: строка, int и double. Я предполагаю, что они разделены пробелами.

Если это так, то вам не нужно std::getline(). Вместо этого используйте оператор извлечения:

std::ifstream file("input.txt");
std::string s;
if( ! (file >> s) ) {  // a single word extracted from the file
    // failure
}
int n;
// ...
person wilhelmtell    schedule 06.11.2010

О чем говорят ошибки компилятора? Вы уверены, что ошибка вызвана getline? Может быть, это не потому, что getline вызывает, а из-за нескольких объявлений i.

person Flinsch    schedule 06.11.2010
comment
i — это переменная цикла в опубликованном коде, и ее область действия должна быть ограничена циклом for, в котором она была объявлена. В этом случае (без фигурных скобок) строка под ней каждый раз. - person rubenvb; 06.11.2010
comment
Да, как вы правильно указали: он должен быть ограничен циклом for, в котором он был объявлен. Но существуют компиляторы, которые добавляют эти переменные в область, в которой происходит цикл for, а не в цикл for только себя. Поскольку мы не знаем, какой компилятор используется, мы не можем исключить такое поведение. - person Flinsch; 06.11.2010
comment
Второй и третий массивы состоят из int и double. Ни hourAr[i], ни hrateAr[i] не являются допустимыми аргументами для getline, поэтому я предполагаю, что проблема здесь. Я довольно давно не видел компилятор с неработающим циклом for (VC6?) - person David Rodríguez - dribeas; 06.11.2010
comment
Спасибо за отзывы, ребята... В данный момент я использую Visual Studio 2010. Подходит ли getline только для передачи аргументов строковому типу данных? Я знаю, что cin.getline и ifstream getline немного отличаются и ограничены только массивами char... getline так же работает со строками? - person Strata; 06.11.2010
comment
О, и конкретная ошибка, выдаваемая IntelliSense компилятора в отношении последних двух строк getline: Ни один экземпляр перегруженной функции getline не соответствует списку аргументов. - person Strata; 06.11.2010