Чтение в числах и именах с использованием getline в C ++?

0

Поэтому я работаю над этой проблемой часами, и я хотел бы получить некоторую помощь. Завтра у меня есть программа. В принципе, у меня есть входной файл, который имеет имя и фамилию, а затем четыре числа с плавающей запятой. Это выглядит так:

John W.
Smith
78.8 56.5 34.5 23.3
Jane 
Doe
34.5 23.4 35.7 87.0
No
More

Мне нужно прочитать имя и фамилию в массиве указателей. Пока я просто пытаюсь прочитать в каждой строке переменную "имя", и я выводю в текстовый файл, чтобы увидеть, правильно ли я читаю данные. К сожалению, он останавливается после чтения в поплавках, он не читается в следующих именах.

char *newPtr;               
char *nameList[50] = {0};   
char name[15];  
int i = 0; 
infile.getline(name, 15);

while (strcmp (name, "No") != 0)
{
    newPtr = new char[15];
    strcpy(newPtr, name);
    nameList[i] = newPtr;
    infile.getline(name, 15);
    outfile << name << endl;
    i++;
}

До сих пор выход был только что:

Джон У.

кузнец

78,8 56,5 34,5 23,3

EDIT: цикл в настоящее время бесконечен, но из моего вывода я знаю, что я еще не обработал все остальные имена, я останавливаюсь на первых числах.

Если бы я мог помочь, это было бы здорово! Я очень ограничен функциями, которые я могу использовать, я уверен, что я должен просто использовать функцию getline здесь, я не могу использовать ничего интересного.

В ее слайдах мой учитель здесь имеет этот код, который помогает нам читать в именах:

char *newPtr;
char *NameList[6] = {0};
char Name[20];
int a = 0;
infile.getline(Name, 20);
while(strcmp(Name, sentinel) != 0)
{
newPtr = new char[20];
strcpy(newPtr,Name);
NameList[a++] = newPtr;
infile.getline(Name,20);
}

Мы еще не учили о струнах, и я уверен, что не могу использовать то, о чем мы не говорили в классе. Спасибо за помощь до тех пор, кто прокомментировал это.

  • 0
    Не связано с вашей проблемой, но у вас утечка памяти в цикле while. Почему вы используете массивы char, а не std::string s? Кроме того, ваш первый strcmp сравнивает выделенное, но неинициализированное name (что означает отсутствие завершающего нулевого символа).
  • 0
    это то, как мой учитель рассказал классу, как это сделать. Я также очень смущен.
Показать ещё 5 комментариев
Теги:
string
pointers
input
getline

1 ответ

0
Лучший ответ

Ты почти там... главное, ты забыл попробовать прочитать цифры. Код ниже читает их в w, x, y и z но затем игнорирует их... вы должны делать все, что вам нужно, с ними, например, возможно, создать второй массив для фамилий и либо третий двумерный массив для поплавков или одномерный массив в 4 раза длиннее....

char *nameList[50] = {0};   
char name[15];  
int i = 0; 

while (infile.getline(name, sizeof name) && strcmp(name, "No") != 0)
{
    char* newPtr = new char[sizeof name];
    strcpy(newPtr, name);
    nameList[i] = newPtr;
    double w, x, y, z;
    if (infile.getline(name, sizeof name) && infile >> w >> x >> y >> z)
        outfile << name << endl;
    else
    {
        std::cerr << "missing rest of data for " << nameList[i] << " found\n";
        exit(EXIT_FAILURE)
    }
    i++;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню