2015-05-10 2 views
1

Я преподаю сам C++ и ищу, как это сделать. Позвольте мне привести пример, чтобы прояснить мое намерение.C++ Как читать txt-файл и извлекать числовые значения, кроме строки (и наоборот)

Это txt-файл, и содержание соответствует.

Matt 18 180.0 88.5 
Angela 20 155.5 42.2 

В каждом ряду содержится информация об имени, возрасте, высоте и весе лица.

Что я пытался сделать, так это получить эти 4 типа информации отдельно и сохранить их в разных переменных на основе типа информации.

vector<string> name; //"Matt" or "Angela" are stored here. 
vector<int> age; //18 or 20 
vector<double> height; //The same logic goes for this vector and the next one 
vector<double> weight; 

По крайней мере, я обнаружил, что информация в текстовые файлы могут быть сохранены в строковых переменных с помощью ifstreamObject.open(filename.c_str()) и getline(ifstreamObject, string). Однако, используя этот метод, я бы получил только строковые значения, которые соответствуют каждой строке. Другими словами, я не могу отличить строковые значения от числовых значений.

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

Любые советы будут оценены.

ответ

3

Что вы можете сделать, это использовать поток непосредственно,

std::string name; 
int age; 
double height, weight; 

while(ifstreamObject >> name >> age >> height >> weight) 
{ 
    // process name, age, height and weight 
} 

Недостатком является то, что оператор вставки поток не будет читать, пока первый пробельные. Итак, если вы хотите, чтобы прочитать всю строку в виде строки, а затем использовать getline, процесс строки соответственно, «карту» обратно строка прочитана getline в istringstream,

std::istringstream is(str); // constructs an istringstream from the string str 

затем использовать is аналогично тому, как вы Используйте поток.

+0

Большое спасибо. Могу ли я задать еще один вопрос? Оператор '>>', очевидно, разделяет каждый строковый блок (в приведенном выше примере каждый строковый блок может быть «Matt», «18», «180.0» и т. Д.), Исходя из того, есть ли пробел или нет. Я также думаю, что мне нужно поместить имя переменной между '>>', чтобы обнаружить каждый строковый блок. Я прав? Googling 'C++ ifstream >> operator' показывает результаты, которые связаны с' C++ istream >> operator', а не 'ifstream'. – Hiroki

+0

@YMD да, это правильно. И оператор извлечения наследуется от 'istream' (который является базовым классом' ifstream'). – vsoftco

+0

Я вижу. Еще раз спасибо вам большое :) – Hiroki

0

Если вы знаете, что между каждой записью есть определенный символ (например, вкладка), вы можете использовать String.find_first_of и подстроки, чтобы разделить строку на части и проанализировать их в полях, которые у вас есть. Check http://www.cplusplus.com/reference/string/string/ для получения дополнительной информации

0

Привет, вы можете использовать stl :: string методы для управления строкой строки, чтобы извлекать эти 4 типа информации отдельно.

использовать std::string::find_first_of, чтобы найти каждое начало пробела и использовать std::string::find_first_not_of, чтобы найти все символы без пробела. используйте std::string::substr для извлечения подстроки из строки строки. Также используйте atoi для преобразования значения строки в int.

, например,

//rowSrting holds the data of one line in file

std::size_t nameEnd = rowString.find_first_of(" "); 
string name = rowString.substr(0, nameEnd-1); 

std::size_t ageFirst = rowString.find_first_not_of(" ", nameEnd); 
std::size_t ageEnd = rowString.find_first_of(" ", ageFirst); 
int age = atoi(rowString.substr(ageFirst, ageEnd-1));