2010-04-05 2 views
6

num.txt이라는 텍스트 파일이 있는데이 파일의 내용은 123입니다.C++ 초보자 : 데이터를 읽는 함수에 fstream 전달

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, (char*)&num); 
    cout << "Second Time: " << num << endl; 
} 

출력은 다음과 같습니다 :

First Time: 123 
Second Time: 3355185 

를 어떻게 여전히 주에서 변수를 할당하는 기능 읽을 된 fstream를 얻기 위해 나를 알아내는 데 도움이 수 그럼 난 다음 있나요? alt_reader에 정말 더 많은 것들이 있기 때문에 나는이 일을하고 있습니다. 그러나 이것은 내가 붙어있는 부분입니다. 도움을 많이 주셔서 감사합니다.

UPDATE : 빌 Oneal의 의견을 사용 는, 나는

void alt_reader(ifstream &file, stringstream &str, int n){ 
    char buffer[n+1]; 
    file.read(buffer, n); 
    buffer[n] = 0; 
    str << buffer; 
    cout << "First Time: " << buffer << endl; //First Time: 123 
} 

int main() { 
    ifstream inFile; 
    stringstream strm; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, strm, 3); 
    cout << "Second Time: " << num << endl; //Second Time: 123 
} 

감사를 작성했습니다. 지금 거기에있는 것에 대한 비판은 무엇입니까?

답변

7

변수를 처음 인쇄 할 때 파일을 텍스트 파일로 처리하여 인쇄하면 char *으로 인쇄됩니다 (그리고 충돌하지 않았기 때문에 운이 좋았습니다). 두 번째로 인쇄 할 때는 int으로 재 해석하여 표현을 완전히 다르게 만들었습니다.

한 유형에서 다른 유형으로 포인터를 캐스트 할 때마다 일반적으로 정의되지 않은 동작이 호출됩니다. char은 (는) int과는 관련이 없으므로 여기에 있습니다.

편집 : 당신은 여기에 두 개 이상의 문제가

#include <sstream> 

void foo(std::stream &str) { 
str << "42\n"; 
}; 

int main() { 
int aNumber; 
std::stringstream aStringStream; 
foo(aStringStream); //Pass our stream to the function. It contains 
    //"42\n" when the function returns. 
aStringStream >> aNumber; //aNumber == 42 
aNumber += 10; //aNumber == 52; 
std::cout << aNumber; //Print "52" 
} 
+0

감사합니다. fstream을 전달하고 함수에서 읽은 값을 가져 오는 것에 대한 조언 (return 문 없이는?) – physicsmichael

+0

@ vgm64 : 예. 편집을 참조하십시오. –

+0

@Bill ONeal : 방금 기술을 사용하여 코드를 확장하려는 시도를 추가했습니다. 그것은 작동합니다. 그거에 대해서 어떻게 생각해? – physicsmichael

2

: 귀하의 코멘트 질문에 대답합니다. 당신은 alt_reader에 문자열 버퍼를 통과해야

  1. , 대신 당신이 int를 전달하는 : 주()에서

    .

  2. 문자열 '123'을 읽고 싶지만 int의 값을 123으로하고 싶습니다.

당신은 할 수 : 나는 alt_readeratoi에 int로 문자열에서 변환 ( SCII)를 line[3]=0; 않는 추가 한

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    line[3]=0; 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    inFile.open("num.txt"); 

    char buffer[128]; 
    alt_reader(inFile, buffer); 

    int num=atoi(buffer); 
    cout << "Second Time: " << num << endl; 

    return 0; 
} 

참고.

+0

@quamrana : 내가 설명한 상황에서는 완벽하게 작동하지만 읽어야 할 숫자는 반드시 int가 아니며 아래의 문자열 스트림은 int 또는 double에 행복하게 들어갑니다. 그렇다고해도 고맙습니다. – physicsmichael