2013-07-05 4 views
1

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

1 41 -1 -1.492 -2.9555 
1 42 -1 -1.49515 -2.9745 
1 43 -1 -1.49799 -2.99361 
1 44 -1 -1.50051 -3.01283 
1 45 -1 -1.5027 -3.03213 
1 46 -1 -1.50416 -3.05301 
1 47 -1 -1.50556 -3.07248 

(. Числа разделены пробел, а не вкладка)

Я хотел бы написать программу на C++, который читает это значения и помещает их в вектор, но как я могу это сделать?

Я попытался это:

while(!file.eof()){ 
    scanf("%d %d %d %f %f", &x, &y, &z, &eta, &phi); 
} 

Но это не работает.

Может кто-нибудь сказать мне, почему и как я могу это решить?

+0

Каждую строку в avector или каждое число в векторе? – Vijay

+1

Не используйте 'scanf' в C++, у вас есть' std :: cin'. – nouney

+0

Вы говорите, что ваша попытка не работает, но что с ней случилось? Быстрый взгляд предполагает, что он должен правильно читать значения, так же как они хранят их в вашем векторе, который не прошел? – Jules

ответ

2

Вы в C++ поэтому не используйте scanf, предпочитают std::ifstream вместо этого.

#include <fstream> 
using namespace std; 

ifstream file("input.txt"); 
int x, y, z; 
float eta, phi; 
// Read you file until the end 
while(file >> x >> y >> z >> eta >> phi) 
{ 
    // Print the values 
    cout << "x : " << x << " y :" << y << " z : " << z << " eta : " << eta << " phi : " << phi << endl; 
} 

Как показано Армен Tsirunyan, вы можете также использовать struct для хранения данных с vector. Это зависит от того, что вы хотите делать с вашими данными.

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

код будет выглядеть следующим образом:

#include <fstream> 
#include <vector> 
using namespace std; 

struct s_Data 
{ 
    int x, y, z; 
    float eta, phi; 
}; 

istream& operator >> (istream& iIn, s_Data& iData) 
{ 
    return iIn >> iData.x >> iData.y >> iData.z >> iData.eta >> iData.phi; 
} 

ifstream file("input.txt"); 
// Read you file until the end 
s_Data data; 
vector<s_Data> datas; 
while(file >> data) 
{ 
    // Print the values 
    cout << "x : " << data.x << " y :" << data.y << " z : " << data.z << " eta : " << data.eta << " phi : " << data.phi << endl; 

    // Store the values 
    datas.push_back(data); 
} 

Здесь s_Data представляют свой lign с 5-ю значениями, которые вы хотите. vector<s_Data> представляет все значения, считанные в файле.Вы можете прочитать это:

unsigned int size = datas.size(); 
for (unsigned int i = 0; i < size; i++) 
    cout << datas[i].x; // read all the x values for example 
+0

Спасибо большое! Я решил. Если я не хочу использовать struct и я объявляю 5 разных векторов, в чем разница? – Lunatica

+0

Лучше использовать структуру в этом случае. Я полагаю, что ваши 'x',' y', 'z',' eta', 'phi' каждой строки принадлежат одному и тому же объекту или правилу исчисления? В этом случае было бы лучше сохранить их в одном и том же объекте ('struct'). Можете ли вы пометить ответ как принятый? –

0

Вы должны поместить их в массив символов, а затем преобразовать их в float, используя atofhere. Я обычно использую библиотеку fstream, и я читаю их как массив символов, а затем конвертирую их в float/int и т. Д.

0

Это позволит вам иметь столько векторов, сколько линий в вашем файле. Если вы не заинтересованы в том, что вы можете просто использовать простой std::vector<double> и использовать отодвигать свои значения с помощью std::copy

#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 
#include <iostream> 
#include <string> 

std::ifstream file("file.txt"); 
std::istream &is = file; // thanks to polymorphism 
std::string str; 
std::vector<std::vector<double> > vects; 
while (str = getline(is)) 
{ 
    std::vector<double> tmpVect; 
    std::copy (std::istream_iterator<std::string>(is), 
       std::istream_iterator<std::string>(), 
       std::back_inserter(tmpVect)); 
    vects.push_back(tmpVect); 
} 

Это std::copy будет проходить через всю линию, вызывая push_back на временный вектор со значением он просто схватился с линии.

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

0
#include <fstream> 

struct MyData 
{ 
    int x, y, z; 
    double phi, eta; 
}; 

vector<MyData> v; 
ifstream fin("input.txt"); 
MyData d; 
while(fin >> d.x >> d.y >> d.z >> d.phi >> d.eta) 
{ 
    v.push_back(d); 
} 

Или, вы можете перегрузить оператор >> и сделать это:

istream& operator >> (istream& in, MyData& d) 
{ 
    return in >> d.x >> d.y >> d.z >> d.phi >> d.eta; 
} 

int main() 
{ 
    ifstream fin ("input.txt"); 
    vector<MyData> v; 
    v.assign(istream_iterator<MyData>(fin), istream_iterator<MyData>()); 
} 
+0

То же самое я сказал, что wrousseau идет за тобой. Пожалуйста, не отправляйте ответ только на код, особенно если у вас нет ни одного комментария. – stefan

+0

Армен Цирунян таким образом, Где я читаю все строки моего файла? – Lunatica

+0

@Lunatica: вы читаете его в свой вектор v –

-1

Scanf возвращает -1, когда ничего не читать. Ты можешь сделать.

while(scanf()>=0) 
{ 

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