2016-09-22 3 views
0

C++ 배열로 읽으려고하는 파일 (한 줄에 하나씩)에 이중 숫자가 있습니다. 실행하는 동안 나는 아래의 코드를 사용하지만, 아래의 오류가 발생하고있다 :단순 파일에서 double 배열을 읽습니다.

세그먼트 오류를 ​​: 11

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

int main() { 
    string line; 
    ifstream myfile ("temp2.csv"); 
    std::vector<double> myArray; 
    int index = 0; 
    if (myfile.is_open()) 
    { 
     while (! myfile.eof()) 
     { 
      getline (myfile,line); 
      cout << line << endl; 
//   myArray[index++] << line; 
      myArray[index++] = atoi(line.c_str()); 
     } 
     myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 
+2

시주의 사항 '으로 간주된다 나쁜 관행 (http://stackoverflow.com/questions/5605125'그/why-is-iostreameof-inside-a-loop-condition-considered-wrong). – Rakete1111

+1

파일의 모양은 무엇입니까 – thermite

+0

왜 이건 속임수를 찾을 수 없습니까?!? 문제는 벡터가 비어있는 것입니다. – NathanOliver

답변

2

당신은

myArray[index++] = atoi(line.c_str()); 

을 할 수 없습니다 그것은 빈입니다 벡터. 당신은 그것에 push_back 요소가 필요합니다. 또는 충분한 메모리로 초기화하십시오.

이 작동합니다 :

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

int main() { 
    string line; 
    ifstream myfile ("temp2.csv"); 
    std::vector<double> myArray; 
    int index = 0; 
    if (myfile.is_open()) 
    { 
     while (! myfile.eof()) 
     { 
      getline (myfile,line); 
      cout << line << endl; 
//   myArray[index++] << line; 
      myArray.push_back(atoi(line.c_str())); 
     } 
     myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 
1

을이 라인에 :

std::vector<double> myArray; 

당신은 기본 생성자를 사용하여 벡터를 만들 수 있습니다. 설명서에서 볼 수 있듯이 기본 생성자는 비어있는 벡터를 만듭니다. 이 라인에

: 연속적으로 증가 인덱스와 벡터에서

myArray[index++] = atoi(line.c_str()); 

당신 액세스 요소. 그러나 벡터가 비어 있기 때문에 이러한 요소는 존재하지 않으며 색인은 범위를 벗어납니다. 벡터 경계 외부에 액세스하면 정의되지 않은 동작이 발생합니다.

TL; DR 벡터에 요소를 추가하는 것을 잊었습니다.

1

코드가 필요한 것보다 훨씬 복잡합니다. 그냥 한 번에 하나 개의 값을 읽어 훨씬 간단 (! myfile.eof())

std::vector<double> myArray; 
double value; 
std::ifstream myfile(temp2.csv); 
if (!myfile) { 
    std::cout << "Unable to open file\n"); 
    return EXIT_FAILURE; 
} 
while (myfile >> value) 
    myArray.push_back(value); 
+0

OP는 한 줄당 하나의 값을 읽고 나머지는 무시하려고합니다. 이 코드는 모든 값을 읽으며 공백/탭으로 구분됩니다 (파일 형식은 CSV 임). – anatolyg

+0

@anatolyg - 질문은 "한 줄당 하나의 값을 읽고 나머지는 무시하십시오"라고 말하지 않습니다. 이것은 작동하지 않는 코드를 읽는 것으로 추측됩니다. 또한 질문에 "파일 형식은 CSV"가 아닙니다. 다시 말하지만, 파일 확장자를 기반으로 한 추측입니다. 불합리한 추측은 아니지만 코딩 결정은 추측을 기반으로해서는 안됩니다. –

관련 문제