2016-03-05 2 views
1

Мой текстовый файл выглядит следующим образом:прочитать файл построчно и хранить различные переменные

1  52 Hayden Smith  18:16 15 M Berlin 
2  54 Mark Puleo   18:25 15 M Berlin 
3  97 Peter Warrington 18:26 29 M New haven 
4  305 Matt Kasprzak  18:53 33 M Falls Church 
5  272 Kevin Solar   19:17 16 M Sterling 
6  394 Daniel Sullivan  19:35 26 M Sterling 
7  42 Kevan DuPont  19:58 18 M Boylston 
8  306 Chris Goethert  20:00 43 M Falls Church 
9  262 James Sullivan  20:12 28 M Sterling 
10 348 Bill Gaudere  20:17 54 M Hudson 
11 13 Travis Wheeler  20:23 31 M Clinton 
12 69 Eric Anderson  20:34 54 M Clinton 
13 341 Alex Teixeira  20:46 0 M Clinton 
14 112 James Long   20:50 38 M 0 
15 279 Nate Richards  21:31 17 M Berlin 
...................................................... 

Есть восемь столбцов, разделенных «вкладки», кроме имени и фамилия отделяется пробелом.

У меня должно быть восемь различных типов переменных.

int a; 
    int b; 
    string c; 
    string d; 
    string e; 
    int f; 
    char g; 
    string h; 

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

Итак, я попытался это:

std::ifstream infile("text.txt"); 
int a; 
int b; 
string c; 
string d; 
string e; 
int f; 
char g; 
string h; 


while(infile>>a>>b>>c>>d>>e>>f>>g>>h) 
{ 
    cout <<"C is: "<<c<<endl; // just to see if the loop is working. 

} 

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

while(getline(infield, s)): 

Но, не это по сути просто дает мне одну большую жирную линию, со всеми строками и целыми числами разбили вместе.

+0

Я не совсем уверен, можете ли вы сделать все в одной строке, но я бы посоветовал это сделать. При каждой записи, которую вы читаете, есть вероятность ошибки (например, неправильный тип). Я думаю, вы захотите написать код (или, по крайней мере, код отладки), который проверяет наличие ошибок. Кроме того, на самом деле это не дает большой производительности, делая это в одном выражении, а не в нескольких выражениях. – Nard

+2

Рассмотрение формата файла в виде восьми столбцов - большая проблема с вашим подходом. Кто-то собирается вводить имена, такие как «Ли Харви Освальд» или «Барак Хусейн Обама», чтобы убить вашу программу. Нет, есть причина, по которой нет никакой вкладки между именем и вторым именем, и причина в том, что их следует рассматривать как один столбец. Кстати, это также работает с Нью-Хейвеном.BTW: Семейство форматов файлов называется CSV, хотя это вкладка не запятая здесь, и вы должны найти достаточную информацию в Интернете о ее разборе. –

ответ

2

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

3  97 Peter Warrington 18:26 29 M New haven 

Это происходит потому, что пространства в New haven, который не выполнит условие while, поскольку оно не будет скопировано в целочисленное поле, a на следующей итерации. Если вы хотите сохранить эту структуру, возможно, вместо подчеркивания помещать символы подчеркивания. В противном случае перейдите к его синтаксическому анализу по строкам, возможно, с библиотекой std::regex.

Например, изменение строки местоположения, разделяемой символами подчеркивания вместо пробелов, приводит к нахождению всех 15 записей. Для того, чтобы изменить подчеркивание обратно в пространства мы можем использовать std::replace, так что тело вашего цикла в то время как будет выглядеть Лила:

std::cout <<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" "; 
std::replace(h.begin(), h.end(), '_', ' '); 
std::cout<<h<<"\n"; 

(не забудьте включить algorithm)

Мы теперь все наши заходы напечатаны!

Чтобы ответить на ваш первоначальный вопрос, я предполагаю, что файл не существует.

std::ifstream infile("text.txt"); 
if(!infile.is_open()) { 
    std::cout<<"Couldn't find file"; 
    return 0; 
} 
// .. 
+0

Спасибо! Итак, что, если есть одна строка, которая не имеет имени для этого человека, и город, только эти шесть других переменных. Я только что узнал в своем текстовом файле. – JY078

+0

Если какой-либо из них отсутствует, у вас появятся проблемы. Возможно, переместите менее важные вызовы чтения ('infile >> x') за пределы цикла while, чтобы они могли изящно терпеть неудачу. Таким образом, это не сработает, когда чего-то не хватает и чего не будет. Хотя это означает, что вам нужно будет подтвердить введенные вами данные позже, чтобы они были действительными. –

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