2014-12-02 2 views
0

파일의 내용으로 해시 테이블을 만들어야하는 프로그램을 만들고 있습니다. 이 파일에는 키 (int), 이름 (문자열), 코드 (int) 및 비용 (double)이 포함 된 레코드 (한 줄에 1 개)가 들어 있습니다. 대부분의 프로그램에서 해시 테이블을 작성하는 코드를 작성했지만 파일에서 테이블을로드하는 방법을 파악하는 데 문제가 있습니다. 보다 구체적으로, 레코드의 각 부분을 해당 변수에 저장하는 방법은 무엇입니까?파일의 내용을 C++의 변수에 저장합니다.

코드는 다소 길지만 게시하는 것이 내 질문에 대한 답변에 도움이된다고 알려 주시면 기꺼이 알려 드리겠습니다.

나는 내가으로 설정 한 각 레코드에 포함 된 정보를 보유하도록 설정 구조체를 가지고, 그래도 난이 포함되어야한다 생각 하는가하는 것은 다음과

struct record { 
     int key; 
     string name; 
     int code; 
     double cost; 
} 

당신이 다른 부분을 참조해야하는 경우 코드 전체 또는 코드를 알려주십시오.

+0

당신이 어떤 문제가있는을 구체적으로? 구조체 사용법을 모르십니까? –

+0

필자가 주로 사용하는 방법은 파일을 열고 읽는 것이지만 파일의 여러 부분을 관련 변수에 저장하는 방법을 모르겠습니다. 예를 들어, 키는 내 int 키 변수에 저장되어야하며, 이름은 문자열 이름에 있어야합니다. 실제로는 이전에이 작업을 수행 한 적이 없었습니다. 전체 변수를 특정 변수에 저장한다는 의미였습니다. – HiTechRedneck3

+0

귀하가 수락 한 답변은 * 나타날 수도 있지만, 알아 두어야 할 몇 가지 결함이 있습니다. [** 루프 상태의 iostream :: eof가 잘못된 것으로 간주되는 이유는 무엇입니까? **] (http://stackoverflow.com/questions/5605125/). 읽기는 언제든지 실패 할 수 있으며 모든 실패가 eof 상태를 제공하지는 않으므로 정의되지 않은 동작 (잘 정의 된 무한 루프)이 발생할 수 있습니다. @RedAlert에 의해 제안 된대로'while (f >> key >> name >> code >> cost)'조건을 만든 다음 다른 읽기를 제거하면 적어도 그 문제는 해결 될 것입니다. – HostileFork

답변

0

데이터 파일이 공백이 줄의 항목을 분리 한 경우, 예를 들어 다음과 같은 코드를 사용할 수 있습니다

#include <iostream> 
#include <fstream> 

using namespace std; 

typedef struct record { 
    int key; 
    string name; 
    int code; 
    double cost; 
} rec; 

int main() 
{ 
    ifstream f ("data.txt"); 

    rec r; 

    f >> r.key; 
    while (!f.eof()) 
    { 
      f >> r.name; 
      f >> r.code; 
      f >> r.cost; 

      cout << "new record, key=" << r.key 
        << ", name=" << r.name 
        << ", code=" << r.code 
        << ", cost=" << r.cost << "\n"; 
      f >> r.key; 
    } 

    //will also be done by destructor: f.close(); 

    return 0; 
} 
+0

*를 사용하기 전에 *와 *를 읽은 후에 파일 *을 테스트해야합니다. [이 답변을 참조하십시오.] (또한 http://stackoverflow.com/a/5282311/211160) iostream 수동으로 닫을 필요가 없습니다, 소멸자가 그것을 할 것입니다. – HostileFork

+0

예, 정확하게 수행됩니다. "f >> r.key;"를 참조하십시오. 성명서. 닫기를 지적 해 주셔서 감사합니다. 그러나 조기 폐쇄는 다른 처리가 함수에서 수행되는 경우 나쁘지 않습니다. – Palo

+1

여러 번 읽는 중 ... 파일 끝이 읽기 작업에 실패 할 수있는 유일한 방법은 아닙니다. 파일이 없으면 어떻게 될까요? 네트워크 드라이브이고 연결이 끊어진다면 어떻게 될까요? 파일의 데이터가 올바른 형식이 아닌 경우 어떻게해야합니까? 더 나은 오류 처리가 확실히 이상적일지도 모르지만 ... @ deeiip의 대답처럼 적어도 정의되지 않은 동작은 없습니다. 초기 예제는 중요합니다. – HostileFork

2

이 작업을 시도 할 수 있습니다 :

while(_fstream >> key && _fstream >> name && _fstream >> code && _fstream >> cost) 
{ 
    record r; 
    r.key = key; 
    r.name = name; // and so on 
    // now you may do whatever you want to with your r object 
} 

_fstream 입력에 대한 열린 파일 스트림입니다.


@Red 경고 한 바와 같이, 이는 더 우아한 용액됩니다

while(_fstream >> key >> name >> code >> cost) 

_fstream >> key 때문에 복귀 _fstream 자체;

+1

또는'while (_fstream >> key >> name >> code >> cost)' –

관련 문제