Как игнорировать символы новой строки при чтении файла в формате списка - PullRequest
3 голосов
/ 06 августа 2011

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

Например, мой файл .txt может иметь следующий список:

Эгоистичный ген

Ричард Докинз

Прекрасный новый мир

Олдос Хаксли

Солнце тоже встает

Эрнест Хемингуэй

Я должен использовать параллельные массивы для хранения этой информации, а затем иметь возможность форматировать данные следующим образом:

Эгоистичный ген (Ричард Докинз)

Я пытался использовать getline для чтения данных, но когда я иду к форматированию заголовка и автора, я получаю это:

Эгоистичный ген

(Ричард Докинз

)

Как игнорировать символ новой строки при чтении списка из файла?

Это то, что я имею до сих пор:

    int loadData(string pathname)
    {
    string bookTitle[100];
    string bookAuthor[100];
    ifstream inFile;
    int count = -1; //count number of books
    int i; //for variable

    inFile.open(pathname.c_str());
    {
        for (i = 0; i < 100; i++) 
        {
            if(inFile)
            {
                getline(inFile, bookTitle[i]);
                getline(inFile, bookAuthor[i]);
                count++;
            }
        }
        inFile.close();
        return count;
    }

Я очень ценю любую помощь!

Richard

EDIT:

Это моя функция вывода:

    void showall(int count)
    {
        int j; //access array up until the amount of books
        for(j = 0; j < count; j++)
        {
             cout << bookTitle[j] << " (" << bookAuthor[j] << ")";
             cout << endl;
        }    
    } 

Я что-то здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Как говорит @Potatoswatter, std::getline обычно удаляет символ новой строки. Если новые строки все еще проходят, вы, вероятно, используете систему, которая использует \n для новых строк, но ваш файл имеет \r\n новых строк.

Просто удалите лишние переводы строк после их добавления в строку. Вы можете сделать это с чем-то вроде:

s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::isspace)).base(), s.end());

или аналогичный. Вы найдете std::find_if в <algorithm>, std::isspace в <clocale> и std::not1 в <functional>.

0 голосов
/ 06 августа 2011

Я ПОЛУЧИЛ ЭТО!Проблема была в файле, который я читал.Я скопировал и вставил файл с заголовками и авторами из .txt, который дал мне мой инструктор, в новый файл .txt, и теперь он работает так, как у меня!Спасибо всем за помощь !!

...