2011-06-14 3 views
3

У меня довольно простая проблема с C++, но, исходя из C-фона, я не знаю всех возможностей ввода-вывода C++. Так вот проблема:Чтение файла в определенном формате

У меня есть простой .txt файл с определенным форматом, то текстовый файл выглядит следующим образом:

123 points are stored in this file 
pointer number | x-coordinate | y-coordinate 
0  1.123  3.456 
1  2.345  4.566 
..... 

Я хочу зачитать координаты. Как я могу это сделать? Первый шаг в порядке с:

int lines; 
ifstream file("input.txt"); 
file >> lines; 

Это хранит первый номер в файле (т.е. 123 в данном примере) в строках. Теперь я хотел бы перебирать файл и читать только координаты x и y. Как я могу сделать это эффективно?

ответ

4

Я бы, наверное, сделать это примерно как я бы в C, используя только iostreams:

std::ifstream file("input.txt"); 

std::string ignore; 
int ignore2; 
int lines; 
double x, y; 

file >> lines; 
std::getline(ignore, file); // ignore the rest of the first line 
std::getline(ignore, file); // ignore the second line 

for (int i=0; i<lines; i++) { 
    file >> ignore2 >> x >> y; // read in data, ignoring the point number 
    std::cout << "(" << x << "," << y << ")\n"; // show the coordinates. 
} 
+1

'double x, y; ' – davka

+0

« как я бы в C ». Нет никаких iostreams в C. –

+1

@davka: Спасибо - исправлено. @jdv: да, поэтому «просто использовать iostreams» - то есть, используя iostreams вместо 'FILE *'. –

-1

Используйте время цикла

char buffer[256]; 

while (! file.eof()) 

    { 

    myfile.getline (buffer,100); 

    cout << buffer << endl; 

    } 

, а затем вам нужно разобрать свой буфер.

EDIT: Правильным для использования время цикла с EOF является

while ((ch = file.get()) != EOF) { 

} 
+1

-1: 'while (! File.eof())' безвозвратно сломан. http://coderscentral.blogspot.com/2011/03/reading-files.html –

+0

спасибо за исправление меня Джерри. –

+0

наверняка - значительно улучшилось. –

3
#include <cstddef> 
#include <limits> 
#include <string> 
#include <vector> 
#include <fstream> 

struct coord { double x, y; }; 

std::vector<coord> read_coords(std::string const& filename) 
{ 
    std::ifstream file(filename.c_str()); 
    std::size_t line_count; 
    file >> line_count; 

    // skip first two lines 
    file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

    std::vector<coord> ret; 
    ret.reserve(line_count); 
    std::size_t pointer_num; 
    coord c; 
    while (file >> pointer_num >> c.x >> c.y) 
     ret.push_back(c); 
    return ret; 
} 

При необходимости, добавьте обработку ошибок.

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