2011-03-18 7 views
0

파일에서 입력을 배열로 읽으려고합니다. 필자는 필요한 작업을 수행 한 것 같지만 코드는 제대로 작동하지 않습니다. 내가 어디가 잘못 됐는지 말해줘. 내 코드 :파일에서 입력을 읽으려면 어떻게해야합니까?

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을 인쇄합니다.

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

num_rowsnum_cols 코드 이전에 정의 된 다음과 같이

파일의 값은 값이 모두 보통 4

+0

파일로드가 제대로되었는지 확인 하시겠습니까? – Kipotlov

+0

코드가 불완전합니다. num_rows 및 num_cols가 정의되지 않았습니다. – etarion

+0

코드 및/또는 디버깅 오류 검사를 통해 내가 할 수있는 것보다 더 나은 질문에 답할 수 있습니다. – stefaanv

답변

1

이 코드가 같은 형식 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; 
    } 

} 

나의 제안은 당신이 .exe 파일을로 그 Pro.txt 파일이 같은 디렉토리에 있는지 확인하는 것입니다. IDE를 사용하여이 코드를 작성하는 경우 .cpp 파일과 다른 디렉토리 일 가능성이 높습니다.

+0

와우. gr8 제안 데이브. 하지만 지금은 int 값 대신 정크 값을 받고 있어요. 코드에있는 모든 prob입니까? – CHID

+0

@CHID 게시 된 내용을 정확하게 작성하고 실행하여 정상적으로 작동했습니다. 이 코드와 코드 사이에 어떤 차이가 있는지 확인하십시오. 내가 한 유일한 일은'main()'함수에 게시 한 코드를 감싸고'num_rows'와'num_cols'를 정의하는 것입니다. –

0

일 이러한 종류의 할 수있는 간단한 방법을 가지고 가게 편평한 배열 (또는 더 나은 것 std::vector)에있는 자료를 저장하고, 행 및 란에 의하여 성분에 접근하기 위하여 간단한 산법을 사용하기위한 것이다. 이것은 일을 훨씬 단순하게 만듭니다.

이 래퍼는 다음과 같이 수 :

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

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

fstream를 사용하여 강력한 코딩을 위해, 그것은 오류를 확인하는 것이 가장 좋습니다 :

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; 
}; 

그런 다음이 같은 데이터를 읽을 수 있습니다 open() 및 fail() 후에 is_open() 연산자를 사용하는 조건은 < <()입니다. 또한

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

은 그래서 당신은 당신이 읽고있는 무슨 라인과 잘못된 것입니다 확인할 수 있습니다 선호합니다.

행복한 확인 ...

+0

u stefaanv에 감사드립니다. :) 더 명확하게 만들었습니다. – CHID

0

파일에서 행렬을로드하고 싶습니다. 파일에서 값은 공백으로 구분 된 문자열로 저장됩니다. 따라서 파일을로드하고 파일을 한 줄씩 읽고 문자열을 문자열 배열로 분리하고 문자열에서 int로 값을 변환하여 매트릭스에 저장해야합니다.

+0

오, 그것입니다. 나는 직접하려고했습니다. thts 내가있을 수 있습니다 dint .. .. 감사합니다 Andrel – CHID

+0

ifstream 당신을 위해 그 변환 않습니다. 그것은 공간으로 읽어 들이고 읽은 것을 저장 될 변수의 유형으로 변환하려고합니다. –

+0

@dave : 그렇다면 파일이 ifstream 형식을 따릅니다. 아직 출력이 없습니다 .. ifstream이 \ n 문자를 만날 때 ifstream은 무엇을합니까 – CHID

0

각 작업 후 스트림의 상태는 무엇입니까? 확인하지 않고 의 독서를해서는 안됩니다.당신이 결정할 수 또는

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 
} 

: 나는 라인으로 독서 라인의 제안에 동의 할 것이다, 그 후

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

을 : 그리고 당신은 을하지 않고 읽기해서는 안 오픈이 작동하는지 확인 크기에 따라 동적으로 입력 :

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. 
관련 문제