2015-04-03 2 views
0

im new to C++ и работающий над моим первым проектом, который включает в себя чтение .txt-файла формы ниже. У меня есть проблема с вложением значений пикселей в 2D динамическую таблицу, которую я могу проанализировать позже. Мне нужно прочитать значение первого пикселя и поместить его в первый элемент таблицы, а второй - во второй элемент таблицы и т. Д. ... пока у меня не будут все пиксели в таблице высотой 150 и шириной 250 (обратите внимание, что это всего лишь пример, размеры могут меняться в зависимости от файла .txt).Чтение из .txt-файла и ввод значений в многомерный вектор

250 // width pixels 
150 // height en pixels 
2 // number of colours 
205 // colour 0 
35 // colour 1 
0 // value of pixel 0, background colour (white) 
0 // value of pixel 1, background colour (white) 
… 
205 // one pixel of colour 0 (red) 
… 
35 // one pixel of colour 1 (blue) 
… 
0 // value of last pixel, background colour 

Пока мой код выглядит следующим образом (который компилирует):

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

int main() { 

    ifstream f_in; 

    f_in.open("Pixmap.txt"); 

    int largeur; 
    int hauteur; 
    int nbre; 

    if (f_in.is_open()) 
    { 
     f_in >> largeur; 
     f_in >> hauteur; 
     f_in >> nbre; 
    } 


    else cerr << "Unable to open file"; 

    f_in.close(); 


    return 0; 
} 

Любая помощь будет оценена ... спасибо

+0

Я не совсем понимаю, формат ввода. Вы получаете ширину и высоту, а затем X число цветов, за которыми следуют значения цвета X? Что означают значения цвета? Как 205 цвет красный? Кажется, вы не используете RGB? В любом случае, вы можете либо считывать каждый бит данных в вектор/список, либо реструктурировать его/повторно использовать, либо вы можете создать свой многомерный вектор за 1 проход. – Mohammad

+0

Значения в файле txt представляют собой изображение графика. Таким образом, красные пиксели представлены числом 205, синими пикселями на 35 и белыми пикселями на 0. Изображение может содержать любое количество цветов, поэтому эти первые несколько строк предоставляют информацию о количестве цветов и их репрезентативных значениях. Моя проблема заключается в том, чтобы читать эти значения и помещать их в многомерный вектор, борясь, поскольку это только моя пятая неделя C++ .. спасибо :) –

ответ

0

inicialize вектор; векторные точки; Теперь создать цикл

for (int i = 0; i < hauteur; i++) { 
    for (j = 0; j < largeur; j++) { 
     int tmp; 
     f_in >>tmp; 
     points.push_back(tmp); 
    } 
} 

он должен работает

+0

спасибо за это. Я просто не совсем понимаю, как push_back будет работать со столом ... а также как я могу проверить, что правильные значения пошли туда, где они должны. Есть ли другие способы сделать это? –

0

Heres полное решение. Я добавил много комментариев, чтобы помочь вам понять все, что происходит. Мы предполагаем, что файл правильно отформатирован (т. Е. Вы даете ему правильный формат).

Используя это, цвета хранятся в цветовом векторе и пиксельных данных в векторе данных. Мы просматриваем файл 1 раз, читаем все нужные нам значения.

Возможно, вам придется искать некоторые функции, используемые для их лучшего понимания. http://www.cplusplus.com/reference/string/string/getline/ http://www.cplusplus.com/reference/vector/vector/ http://mathbits.com/MathBits/CompSci/APstrings/APgetline.htm (именно поэтому мы должны были использовать фиктивный GetLine)

Я также добавил некоторые отпечатки в конце, чтобы распечатать данные с помощью итераторов. Если что-то неясно, дайте мне знать.

Тестовые данные:

3 
2 
2 
205 
35 
1 
1 
1 
2 
2 
2 

Вот программа:

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

int main() { 

    ifstream f_in; 

    f_in.open("Pixmap.txt"); 

    //If its not open return with an error 
    if (!f_in.is_open()) 
    cerr << "Error!"; 

    int width; 
    int height; 
    int numColours; 

    //Read width and height and num of colours (first 3 lines from file) 
    f_in >> width; 
    f_in >> height; 
    f_in >> numColours; 

    vector<int> colours; //we will store the colours in here 

    //Read in colours 
    for (int c = 0; c < numColours; ++c) { //we have a loop that iterated numColours times 
    int colour; 
    f_in >> colour; //read in colour 
    colours.push_back(colour); //push to the back of the vector so the read will be in order 
    } 

    //Make multidimentional vector 
    //the data(height, vector<int>(width)) means we are initilizing the size of 
    //of the inner vector. There are 'height' rows (ie height number of vector<int> and each 
    //vector<int> is initilised to a vector<int>(width), ie vector<int> of size width 
    //All the initial values will be 0 
    vector<vector<int>> data(height, vector<int>(width)); 

    string input; //input string for reading lines 

    int i = 0; 
    int j = 0; 

    //We need a dummy read so our stream points to the pixel data 
    //We could do this in other ways but right now we will use getline to get a line but not save it 
    //This is actually an issue with using >> operator before getline (see my link to read about it) 
    getline(f_in, input); 

    //We use getline in a loop like this. Get line will get 1 line from the file pointed to by the stream and store it 
    //In the input string 
    while (getline(f_in, input)) { 
    data[i][j++] = stoi(input); //We store the data we need, stoi converts strings to integers 

    //Once j has reached end of vector 
    if (j == width) { 
     ++i; //increase i (we are at a new row now) 
     j = 0; //set j = 0, the width has been reached and we want to start at 0th spot on new line 
    } 
    } 

    //Print out colours 
    int colNum = 0; 
    cout << "Num of Colours: " << numColours << endl; 

    for (auto itc = colours.begin(); itc != colours.end(); ++itc) { 
    cout << "Colour " << ++colNum << ": " << *itc << endl; 
    } 

    //Print out the vector 
    for (auto it = data.begin(); it != data.end(); ++it) { 
    for (auto it2 = it->begin(); it2 != it->end(); ++it2) { 
     cout << *it2 << " "; 
    } 

    cout << endl; 
    } 

    //close stream 
    f_in.close(); 

    return 0; 
} 
+0

спасибо большое .. очень ценю это :)))) –

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