2013-11-03 2 views
0

테스트 파일에서 숫자를 읽고 매트릭스에 표시하려고합니다. 텍스트 파일에는 한 줄에 하나의 번호가 있습니다. 첫 번째 두 줄은 행렬의 크기입니다. (3 및 4)이 숫자의 실제 데이터 값을 행렬에 할당하는 데 문제가 있습니다. 이 경우 값은 2에서 14 사이입니다.텍스트 파일의 C++ 입출력 번호

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <stdlib.h> 
using namespace std; 
#include "Matrix.h" 

int main() 
{ 
     CMatrix A(10,10); //set to arbitrary size 
     int x; 
     int i = 0; 
     int number; 
     int rowsFile; 
     int columnsFile; 

     while (myFile.good()&& myFile.is_open()) 
     { 
      myFile>>x; 
      if (i==0){ //for row dimension 
       rowsFile = x; 
      } 

      if (i==1){ //for column dimension 
       columnsFile = x; 
      } 
      cout<<"Value "<<i<<": "<<x<<endl; //displays the values 


      if (i>=2){ 
       for (int r = 0; r < rowsFile; r++) 
       { 
        for (int c = 0; c < columnsFile; c++) 
        { 
         A.Value(r,c) = x; 
         myFile>>x; 
        } 
       } 
       myFile.close(); 
      } 


      i=i+1; 
     } 
     myFile.close(); 

     CMatrix A(rowsFile, columnsFile); 
     cout<<endl<< "Rows: "<<A.getNumberOfRows()<<endl; 
     cout<< "Columns: "<<A.getNumberOfColumns()<<endl; 
     cout<<endl<<A.ToString(); 
} 

다음은 출력 결과입니다. enter image description here

어떤 이유로 든 내 주석 처리 된 루프가 작동하지 않는 것 같습니다. 도움이 될 것입니다. 고맙습니다!

+0

여기에서하려는 일은 약간 혼란 스럽습니다. 먼저,'rowsFile'과'columnsFile' 값을 읽은 후에'i'를 증가시켜야합니다. 둘째, 입력을 하나의 루프로 처리하고 행렬을 다른 루프에 채우는 경우'x'의 값을 저장해야합니다. 또한, 당신의 제안 된'for' 루프의'i'는 여러분이 사용하고있는 다른'i'를 "어둡게"할 것이고, 이것은 혼란 스럽습니다. – NicholasM

+0

입력이 성공하면 ** 시도해 보려면 ** fileeof()를 사용하지 마십시오 **! 작동하지 않습니다! 또한, ** 성공한 경우 ** 입력 후에 ** 항상 ** 확인 **합니다. 이 두 점에 비해, 그것은 한계점입니다 :'std :: stringstream'이 아닌 문자열에서 입력해야 할 때'std :: istringstream'을 사용하십시오. 스트림을 생성하고 파기하는 것은 다소 힘든 작업입니다. 즉, 빠르게 원격으로 라벨링 할 수있는 무언가에 도착하지 않을 것입니다. –

+0

아래에서 귀하의 의견을 보았습니다. 앞으로 나아가 다. 그것은 당신이 CMatrix A _twice_를 선언 한 것처럼 보입니다 :'main'의 맨 위에 한 번,'Rows :'와'Columns'을 인쇄하기 바로 전에. 사실, 컴파일러가 동일한 범위에 있기 때문에 컴파일러가 그렇게 할 수있게 해주는 것이 놀랍습니다. 두 번째 선언을 제거해보십시오. 그래도 작동하지 않으면 가장 안쪽 루프에 print 문을 추가하십시오. – NicholasM

답변

1

두 코드를 읽은 후 즉시 매트릭스 요소에 배치하기 위해이 코드를 재구성하는 것이 좋습니다.

파일 io 코드가 완전하지 않을 수 있지만 요소 값을 처리하는 루프에서 행 및 열 수를 읽지 않습니다.

// do not declare i here 
int numRows; 
int numCols; 

std::fstream inputFile("filename", std::in); 

if ! (inputFile >> numRows >> numCols) 
{ 
    // Handle error 
} 

// Check that numRows and numCols are acceptable (positive) 
// [not shown] 

CMatrix A(numRows, numCols); 
if (inputFile) 
{ 
    int elementsRead = 0; 
    for (int i = 0; i < numRows; i++) 
    { 
     for (int j = 0; j < numCols; j++) 
     { 
      double x; 
      if (inputFile >> x) 
      { 
       A.Value(i,j) = x; 
       ++elementsRead; 
      } else { 
       // probably an error from too-short file, 
       // token could not be converted to double, etc. 
       // handle appropriately 
       break; 
      } 
     } 
    } 
} 

if (elementsRead != numRows * numCols) 
{ 
    // handle error 
} 

// Use matrix A 
+0

나는이 논리를 사용하지 않으려 고 노력했다. 내 질문을 업데이트했습니다. 바라건대 그것은 더 이해가됩니다. – zweed4u

2

나는 당신에게 완전히이 예에서와 같이, 나는 현명한 파일 라인의 내용을 읽고 벡터에 저장 추천을하려고하는지 이해하지 인해 완전한 솔루션을 제공 할 수는 없지만 :

std::ifstream ifs("file.txt"); 
std::string line; 
std::vector<std::string> lines; 
if (ifs.good()) while (getline(ifs, line)) lines.push_back(line); 
else throw std::runtime_error("An error occurred while trying to read from file."); 

이렇게하면 데이터를보다 쉽게 ​​사용할 수 있습니다.