Проблема с чтением файла с разделителями табуляции в C ++ - PullRequest
0 голосов
/ 27 сентября 2018

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

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib>
using namespace std;

int main() {
ifstream DataFile;
string str;
string title;
string author;
string publisher;
string date;
string ficornon;

if(!DataFile)
{
    cout<<"error";

}
DataFile.open("/Users/Kibitz/Desktop/bestsellers.txt",ios::in);
getline(DataFile,title);
while(!DataFile.eof()) // To get you all the lines.
{

    cout<<title<<endl;
    getline(DataFile,author);
    getline(DataFile,publisher);
    getline(DataFile,date);
    getline(DataFile,ficornon);
    getline(DataFile,title);
}
DataFile.close();
return 0;

}

Первые две строки входного файла:

1876    Gore Vidal    Random House    4/11/1976    Fiction
23337    Stephen King    Scribner    11/27/2011    Fiction

1 Ответ

0 голосов
/ 03 марта 2019

Существует фрагмент кода, который правильно читает пример файла и распечатывает на стандартный вывод.Обратите внимание, что в функции getline используются разделители: tab (символ '\ t') используется для обозначения конца полей данных, а символ новой строки '\ n' используется для обозначения конца строки.Проверьте файл данных, чтобы увидеть, что он действительно содержит разделители табуляции.Функция «peek» проверяет следующий символ в потоке, и если символов больше нет, она устанавливает флаг «eof» потока.Поскольку может быть больше условий, которые могут сделать недействительным поток для чтения, я использую функцию good () в качестве условия в цикле while.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;   

int main() {
std::ifstream DataFile;
string str;
string title;
string author;
string publisher;
string date;
string ficornon;

  DataFile.open("bestsellers.txt",std::ifstream::in);
// getline(DataFile,title);  // don't need this line
  DataFile.peek(); // try state of stream
  while(DataFile.good())  
  {
    getline(DataFile,str,  '\t');     // you should specify tab as delimiter between filelds
    getline(DataFile,author, '\t');   // IMO, better idea is to use visible character as a delimiter, e.g ','  or ';' 
    getline(DataFile,publisher, '\t');
    getline(DataFile,date,'\t');
    getline(DataFile,ficornon,'\n');   // end of line is specified by '\n'
    std::cout << str << " " << author << " " << publisher <<  " " << date << " " << ficornon << std::endl;
    DataFile.peek(); // set eof flag if end of data is reached
  }

  DataFile.close();
  return 0;
}
/*
Output:
1876 Gore Vidal Random House 4/11/1976 Fiction
23337 Stephen King Scribner 11/27/2011 Fiction
(Compiled and executed on Ubuntu 18.04 LTS)
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...