Использование getline для извлечения информации и ее сохранения в типе данных в С++

Вот код, который я написал, который не завершен.

string line; 
ifstream fp ("foo.txt"); 
if (fp.fail()){
    printf("Error opening file %s\n", "foo.txt");
    return EXIT_FAILURE; 
}

unsigned int lineCounter(1); 
while(getline(fp, line)){
    if(lineCounter == 1){
        lineCounter++;
    } // to skip first line
    else{
        // find and extract numbers
    } 
}

Файл foo.txt выглядит следующим образом.

x0,x1,y0,y1
142,310,0,959
299,467,0,959
456,639,0,959
628,796,0,959

По сути, числа — это координаты x и y. Все, что мне нужно, — это извлечь числа в виде данных, который легко читается, и иметь доступ к ним, как к матрице. Он должен хранить как 4 контейнера, имеющие [142, 310, 0, 959], [299, 467, 0, 959]... и так далее для 4 строк.

Я попробовал функцию find(), но я не уверен, как правильно ее использовать, чтобы поместить их в тип данных.

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


person js0823    schedule 10.03.2011    source источник
comment
Это то же самое, что и: массивов в c">stackoverflow.com/questions/5239570/?   -  person Thomas Matthews    schedule 10.03.2011


Ответы (2)


Опираясь на ответ @Martin:

std::string line;
std::getline(file, line);

std::stringstream linestream(line);

int  a,b,c,d;
char sep; // For the comma

// This should work even if there are spaces in the file.
// The operator >> will drop leading white space
// Then read the next type
//      For int object will read an integer from the stream
//      For char object will read the next char (after dropping leading white space)
linestream >> a >> sep >> b >> sep >> c >> sep >> d;

Как мы можем получить эти четыре значения в матричной структуре данных? Во-первых, объявите это где-нибудь с соответствующей областью действия и временем жизни:

std::vector< std::vector<int> > matrix; // to hold everything.

Затем добавьте этот код в цикл чтения строк:

{
    std::vector <int> vi;
    vi.push_back(a);
    vi.push_back(b);
    vi.push_back(c);
    vi.push_back(d);
    matrix.push_back(vi);
}

Наконец, в вашем коде, который анализирует матрицу:

int item;
item = matrix[0][0] + matrix[1][1] + matrix[2][2]; // for example.
person Robᵩ    schedule 10.03.2011

Чтобы прочитать 4 числа, разделенные запятой, сделайте это;

std::string line;
std::getline(file, line);

std::stringstream linestream(line);

int  a,b,c,d;
char sep; // For the comma

// This should work even if there are spaces in the file.
// The operator >> will drop leading white space
// Then read the next type
//      For int object will read an integer from the stream
//      For char object will read the next char (after dropping leading white space)
linestream >> a >> sep >> b >> sep >> c >> sep >> d;
person Martin York    schedule 10.03.2011