2015-01-29 2 views
0

어떤 이유로 아래 코드는 내 double 배열에 0s를 저장하고 파일을 만들려고 시도하지 않으므로 0을 쓰지 않습니다. 이것은 C++로 프로그래밍 한 첫 번째 시간이므로 기본적인 것들에 익숙해졌습니다. 어떤 도움을 주셔서 감사합니다. 아래 무엇으로 업데이트 getMatrix 기능과 지금은 만들 수 없습니다 여전히 잘못된 출력 값을 받고 있어요 :파일에서 두 개의 행을 읽는 데 문제가 있습니다. C++

#include <iostream> 
#include <fstream> 
#include <random> 

using namespace std; 

double* getMatrix(int m, int n, char const* fileName) { 
    ifstream inFile(fileName); 
    if(!inFile.is_open()) { 
     throw std::runtime_error("failed to open file"); 
    } 
    double* newMatrix = new double[m*n]; 
    for (int i = 0; i < m * n; ++i) { 
     inFile >> newMatrix[i]; 
    } 
    inFile.close(); 
    return newMatrix; 
} 

void writeMatrix(int n, int m, double* matrix, char const* fileName) { 
    ofstream out(fileName); 
    for(int i=0; i < m*n && out; ++i) { 
     out << matrix[i] << "\n"; 
    } 
    return; 
} 

int main(int argc, char *argv[]) { 
    double* newMatrix = getMatrix(3, 4, "matrixA.txt"); 
    for(int i = 0; i < 12; ++i) { 
     cout << newMatrix[i] << endl; 
    } 
    writeMatrix(3, 4, newMatrix, "matrixC.txt"); 
    delete newMatrix; 
} 

여기에 내가

0.314723686393179 
    0.405791937075619 
    -0.373013183706494 
    0.413375856139019 
    0.132359246225410 
    -0.402459595000590 
    -0.221501781132952 
    0.046881519204984 
    0.457506835434298 
    0.464888535199277 
    -0.342386918322452 
    0.470592781760616 

편집 읽을려고 파일입니다 파일 여기에 "matrixC.txt"

double* getMatrix(int m, int n, char* const fileName) { 
    ifstream inFile(fileName); 
    double* newMatrix = new double[m*n]; 
    try { 
     for (int i = 0; i < m * n; ++i) { 
      inFile >> newMatrix[i]; 
     } 
    } catch (ifstream::failure e) { 
     cout << "exception opening file"; 
    } 

    inFile.close(); 
    return newMatrix; 
} 

와 내가 출력으로 얻고 무엇

-1.28823e-231 
-1.28823e-231 
6.95324e-310 
6.95327e-310 
6.95324e-310 
6.95327e-310 
0 
0 
0 
0 
0 
0 

edit2 : 주 코드 블록이 파일이 열려 있지 않은 경우 처리하는 최신 코드로 업데이트되었습니다. 아직하지 않습니다

EDIT3 : 내가 문제를 해결
가, 난 그냥 컴파일하고 실행하려고

+2

코드를 최소한의 예제로 줄이려면 입력을 stringstream으로 바꾸십시오. 앞으로도'std :: vector' 사용을 고려해보십시오. 마지막으로, 입력 파일을 열 수 없다는 사실을 실제로 처리하지는 않습니다. 그게 잘못이라고 생각합니다. 그냥'던질 std :: runtime_error ("파일을 열지 못했습니다");'일어나는 경우. BTW : 반환하기 전에 스트림을 닫는 불필요한 및 함수의 다른 종료 경로에 어쨌든 생략. –

+0

좋은 스타일이라고해도 벡터를 사용할 수 없습니다. 또한, 나는 C++ 예외 처리를 알지 못하기 때문에 throw 문을 어디에 두어야하는지 이해하지 못합니다. 네가 숟가락으로 만들어서 미안하다. – vicg

+1

관련 없음 : 또한 파일 이름 매개 변수 유형이 잘못되었습니다. 'char * const'와 가지고 있어야하는 것,'char const *'(또는'const char *') 사이에는 근본적인 차이점이 있습니다. 전자는 변경 불가능한 데이터에 대한 포인터입니다. 후자는 변경 불가능한 데이터에 대한 가변 포인터입니다. 컴파일러에서 경고해야합니다. 그렇지 않은 경우 경고 수준을 높입니다. – WhozCraig

답변

1

내 CMakeLists.txt 파일에이 라인 세트 (CMAKE_RUNTIME_OUTPUT_DIRECTORY "~/ClionProjects/MatMult")를 추가하여 코드 및 include 지시문을 신속하게 수정 한 후 잘 컴파일되어 오류를 재현 할 수 없습니다.

여기 내가 사용하는 코드입니다 :

$ g++ test.cc && ./a.out > test.txt 
$ diff test.txt matrixC.txt 
$ cat matrixC.txt 
0.314724 
0.405792 
-0.373013 
0.413376 
0.132359 
-0.40246 
-0.221502 
0.0468815 
0.457507 
0.464889 
-0.342387 
0.470593 

이해야하는데 방법이 없습니다 :

#include <iostream> 
#include <fstream> 
#include <stdexcept> 

using namespace std; 

double* getMatrix(int m, int n, char const* fileName) { 
    ifstream inFile(fileName); 
    if(!inFile.is_open()) { 
     throw std::runtime_error("failed to open file"); 
    } 
    double* newMatrix = new double[m*n]; 
    for (int i = 0; i < m * n; ++i) { 
     inFile >> newMatrix[i]; 
    } 
    inFile.close(); 
    return newMatrix; 
} 

void writeMatrix(int n, int m, double* matrix, char const* fileName) { 
    ofstream out(fileName); 
    for(int i=0; i < m*n && out; ++i) { 
     out << matrix[i] << "\n"; 
    } 
    return; 
} 

int main(int argc, char *argv[]) { 
    double* newMatrix = getMatrix(3, 4, "matrixA.txt"); 
    for(int i = 0; i < 12; ++i) { 
     cout << newMatrix[i] << endl; 
    } 
    writeMatrix(3, 4, newMatrix, "matrixC.txt"); 
    delete newMatrix; 
} 

여기에 내가 구축하고 실행하는 방법은?

+0

내 CMakeLists.txt 파일에 실제로 내 CMake.txt 파일과 함께. 이것은 툴체인을 모른 채 무언가에 들어갈 때 일어나는 일입니다. 도와 주셔서 감사합니다 – vicg

관련 문제