Как я могу прочитать входные данные из файлов? - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь прочитать входные данные из файла в массив.Я, кажется, сделал все необходимое, но код работает не так, как должен.Пожалуйста, скажите мне, где я иду не так.Это мой код:

int pb[10][10];
int i,j,n;
string ip_filename = string("pro.txt");

    ifstream fil1;

    fil1.open(ip_filename.c_str());

// to store the probabilities of the nodes
for(i=0;i<num_rows;i++)
    for(j=0;j<num_cols;j++)
    fil1 >> pb[i][j];

fil1.close();

for(i=0;i<num_rows;i++)
{
for(j=0;j<num_cols;j++)
    cout<<pb[i][j]<<" ";
cout<<endl;
}

Текстовый файл находится в том же каталоге, что и файл cpp.При печати вывода он просто печатает 0 независимо от значения в файле.

Значения в файле сохраняются следующим образомранее в коде оба имеют значение 4.

Ответы [ 5 ]

1 голос
/ 18 марта 2011

Этот код прекрасно работает для меня с pro.txt, отформатированным как вы показываете:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    int num_rows = 4;
    int num_cols = 4;
    int pb[10][10];
    int i,j,n;
    string ip_filename = string("pro.txt");

    ifstream fil1;

    fil1.open(ip_filename.c_str());

    // to store the probabilities of the nodes
    for(i=0;i<num_rows;i++)
        for(j=0;j<num_cols;j++)
            fil1 >> pb[i][j];

    fil1.close();

    for(i=0;i<num_rows;i++)
    {
        for(j=0;j<num_cols;j++)
            cout<<pb[i][j]<<" ";
        cout<<endl;
    }

}

Я бы посоветовал убедиться, что файл pro.txt находится в том же каталоге, что и ваш .exe-файл. Если вы используете IDE для создания этого кода, скорее всего, он отличается от каталога .cpp.

0 голосов
/ 18 марта 2011

Каков статус потока после каждой операции?Вы не должны читать без проверки.И вы не должны читать, не убедившись, что открытое сработало:

ifstream fill( ip_filename.c_str() );
if ( !fill ) {
    //  error handling, open failed...
}

После этого я бы согласился с предложением читать построчно:

int row = 0;
string line;
while ( getline( fill, line ) && row < size( pb ) ) {
    istringstream sLine( line );
    int col = 0;
    int tmp ;
    while ( sLine >> tmp && col < size( pb[ row ] )) {
        pb[row][col] = tmp;
        ++ col;
    }
    if ( col != size( pb[ row ] ) ) {
        //  Input error, too few entries
    } else if ( sLine >> ws && sLine.get() != EOF ) {
        //  Input error, garbage at end of line <row>
    }
    ++ row;
}
if ( row != size( pb ) ) {
    //  Input error, garbage at end of file
}

В качестве альтернативы,Вы можете определить размеры динамически, в зависимости от ввода:

std::vector<std::vector<int> > pb;
ifstream fill( ip_filename.c_str() );
if ( !fill ) {
    //  error handling, open failed...
}
string line;
while ( getline( fill, line ) ) {
    std::vector<int> tmp1;
    istringstream sLine( line );
    int tmp2;
    while ( sLine >> tmp2 ) {
        tmp1.back().push_back( tmp2 );
    }
    if ( sLine >> ws && ! sLine.eof() ) {
        //  input error: non-numeric data in line
    } else if ( ! pb.empty() && tmp1.size() != pb.back().size() ) {
        //  input error : inconsistent number of columns.
    }
}
//  Check here if square matrix required.
0 голосов
/ 18 марта 2011

При использовании fstream для надежного кодирования лучше всего проверять условия ошибок с помощью is_open () после open () и fail () после оператора << (). <br> Кроме того, предпочитают

while(getline(fil1, lineString))
{
  ...;
}

чтобы вы могли проверить, в какой строке вы читаете и что идет не так.

Удачной проверки ...

0 голосов
/ 18 марта 2011

Как я вижу, вы хотите загрузить матрицу из файла. В файле ваши значения хранятся в виде строки, разделенной пробелом. Таким образом, вы должны загрузить свой файл, прочитать файл построчно, разделить вашу строку в массив строк и преобразовать ваши значения из строки в int и сохранить их в вашей матрице.

0 голосов
/ 18 марта 2011

Обычно самый простой способ сделать такие вещи - хранить данные в плоском массиве (или, что еще лучше, std::vector), и использовать простую арифметику для доступа к элементам по строкам и столбцам.Это делает вещи намного проще.

Оболочка для этого может выглядеть так:

template<int ColumnCount>
class MyMatrix {
public:
    template<class T>
    MyMatrix(T & begin, T & end) : data(begin, end) {}

    int getItem(int i, int j) const {
        return data[i*ColumnCount+j];
    }
private:
    std::vector<int> data;
};

Тогда вы можете прочитать данные следующим образом:

std::ifstream file1("pro.txt");
std::istream_iterator<int> begin(file1);
std::istream_iterator<int> end;

MyMatrix<4> m(begin, end);
...