2014-01-11 2 views
0

다음 형식의 학생 기록이있는 파일이 있습니다.파일에서 데이터를 꺼내서 C++로 문자열에 저장하십시오.

Umar|Ejaz|12345|[email protected] 
Majid|Hussain|12345|[email protected] 
Ali|Akbar|12345|[email protected] 
Mahtab|Maqsood|12345|[email protected] 
Juanid|Asghar|12345|[email protected] 

데이터는 다음과 같은 포맷에 따라 저장되었습니다

firstName|lastName|contactNumber|email 

라인 (기록)의 갯수가 제 프로그램의 한계 (100)를 초과 할 수 있으며, I는 다음 정의한 문자열 변수. 내가 해당 문자열에 데이터를 입력하려면, | ''

#define MAX_SIZE 100 
// other code 
string firstName[MAX_SIZE]; 
string lastName[MAX_SIZE]; 
string contactNumber[MAX_SIZE]; 
string email[MAX_SIZE]; 

지금, 나는 파일에서 데이터를 끌어 원하고, 구분 기호를 사용하여. 문자열 변수에 데이터를 다시 넣으려면 다음 전략을 사용하고 있습니다.

ifstream readFromFile; 
readFromFile.open("output.txt"); 
// other code 
int x = 0; 
string temp; 

while(getline(readFromFile, temp)) { 
    int charPosition = 0; 
    while(temp[charPosition] != '|') { 
     firstName[x] += temp[charPosition]; 
     charPosition++; 
    } 
    while(temp[charPosition] != '|') { 
     lastName[x] += temp[charPosition]; 
     charPosition++; 
    } 
    while(temp[charPosition] != '|') { 
     contactNumber[x] += temp[charPosition]; 
     charPosition++; 
    } 
    while(temp[charPosition] != endl) { 
     email[x] += temp[charPosition]; 
     charPosition++; 
    } 
    x++; 
} 

각 문자열 끝에 null 문자 '\ 0'을 첨부해야합니까? 그리고 첨부하지 않으면 실제로 프로그램에서 문자열 변수를 구현할 때 문제가 발생합니다. 저는 C++에 익숙하지 않습니다.이 솔루션을 제안했습니다. 누구든지 더 나은 기술을 가진다면, 그는 분명 환영받을 것입니다.

편집 : 또한 char (acter)와 endl을 비교할 수 없습니다. 어떻게하면됩니까?

편집 : 작성한 코드가 작동하지 않습니다. 그것은 나에게 다음과 같은 오류를 준다.

 Segmentation fault (core dumped) 

참고 : .txt 파일 만 사용할 수 있습니다. .csv 파일은 사용할 수 없습니다.

+0

예.널 종료가 아닌 문자열은 C 스타일 코드를 작성할 때 모든 종류의 문제를 일으킬 수 있습니다. 예 : 'strlen()'은 null 값을 찾을 때까지 문자열을 계속 스캔 할 것이기 때문에 약간의 미친 값을 리턴 할 것입니다. –

+0

나는 C++로 모든 코드를 작성하지 않을 것이며 C로 작성하지 않을 것입니다. 그러면 C++에서 문제가 발생할 것입니까? –

+0

이유 : firstName [x] + = temp [charPosition]; ? = (같음)뿐만 아니라 x var은 항상 각 값에서 동일한 값을 가지므로 파일의 모든 문자는 각 문자열의 0 위치에 쓰여지고 마지막 문자를 덮어 씁니다. – hidrargyro

답변

2

null 문자로 C 스타일 문자열을 종료하지 않으면 문자열이 끝나는 위치를 확인할 방법이 없습니다. 따라서 문자열을 종료해야합니다.

나는 개인적으로 std::string 개체로 데이터를 읽을 것입니다 :

std::string first, last, etc; 
while (std::getline(readFromFile, first, '|') 
    && std::getline(readFromFile, last, '|') 
    && std::getline(readFromFile, etc)) { 
    // do something with the input 
} 

std::endl 함수 템플릿으로 구현 된 조작이다. char을 그와 비교할 수 없습니다. std::endl을 사용하는 이유는 거의 없습니다. 왜냐하면 정말로 느린 쓰기를하는 개행을 추가 한 후에 스트림을 플러시하기 때문입니다. 개행 문자 (예 : '\n')와 비교하려했을 것입니다. 그러나 std::getline()으로 문자열을 읽으므로 줄 바꿈 문자가 이미 제거됩니다! 그렇지 않으면 temp.size()자를 초과하여 액세스하지 못하도록해야합니다.

레코드에는 문자 배열이 아닌 문자열 배열이 포함되어 있으며 각각 char을 할당합니다. char something[SIZE]을 원하거나 문자열을 저장할 것입니다.

4

이렇게하는 데는 여러 가지 기술이 있습니다. "[C++] read file"에 대한 StackOveflow 검색을 통해 몇 가지 방법을 더 살펴 보시기 바랍니다.

찾기 및 하위 문자열
당신은 구분 기호를 찾은 다음 위치와 구분자 사이에 문자열을 반환하는 std::string::substr를 사용하도록 std::string::find 방법을 사용할 수 있습니다.

+0

그것은 마법입니다. 매우 직관적입니다. 나는 그것을 사용하고 싶다. 하지만 작동하지 않기 때문에 제 코드에 어떤 문제가 있는지 말해 주시겠습니까? Segmentation 오류 (코어 덤프) 오류가 발생하며 작동하지 않는 이유를 모르겠습니다. –

+0

디버거를 사용하여 단일 단계를 수행하면 어떤 선이 실패합니까? –

+0

저는 C++과이 세상을 처음 접했습니다. 그래서 C++ 디버거를 사용하지 않습니다. 간단한 프로그램을 작성하고 우분투에서 commmand 행 도구를 사용하여 g ++를 통해 실행합니다. –

관련 문제