Чтение файла в определенном формате - PullRequest
3 голосов
/ 14 июня 2011

У меня довольно простая проблема с 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. Как я могу сделать это эффективно?

Ответы [ 3 ]

4 голосов
/ 14 июня 2011

Я бы сделал это примерно так же, как в 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.
}
3 голосов
/ 14 июня 2011
#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;
}

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

0 голосов
/ 14 июня 2011

Используйте цикл while

char buffer[256];  

while (! file.eof() )  

   {  

     myfile.getline (buffer,100);  

     cout << buffer << endl;  

   }  

, а затем вам нужно проанализировать ваш буфер.

EDIT: для использования цикла while с eof правильно:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...