2012-12-14 8 views
2

long을 C++ fstream 클래스를 사용하여 텍스트 파일에 쓰려고합니다. 파일은 실행 전에 디스크에 이미 만들어져 있습니다. 다음 코드를 실행하고 초기 값을 읽을 수 있지만 새 값을 저장할 수 없으므로 덮어 씁니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?fstream에서 <<를 사용하여 쓰기

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 


using namespace std; 

int main(int argc, char* argv[]) { 

    long f; 

    fstream myFile("data.txt", fstream::in|fstream::out); 
    cout << "f before: " << f << endl; 
    myFile >> f; 
    cout << "f after: " << f << endl; 
    f++; 
    cout << "f after increment: " << f << endl; 

    myFile << f; 
    myFile.close(); 

    return 0; 
} 

그 후, 파일의 값을 읽었지만 변경되지 않았습니다. 내가 여기서 뭘 잘못 했니?

+0

먼저 'f'를 0으로 초기화하십시오. 당신은 똑같은 자리에있는 것이 아니라 이전의 것의 뒤에 새로운 f *를 쓰고 있습니다. –

답변

1

카운트를 올바르게 업데이트하려면 myFile << f; 앞에 myFile.seekp(ios::beg);을 추가해야합니다.

마지막에 계속 추가하려면 myFile << f; 앞에 myFile.clear();을 추가하십시오. 이로 인해 콘텐츠는 1 ->12 -> ->12131214 ->1213121412131215이됩니다. 이것은 입력을 읽을 때 eof에 도달하기 때문에 필요합니다. get 및 put 포인터는 same입니다.

정확하게 지적했듯이 파일의 파일명은 이며, 줄 바꿈이 아니라입니다. 따라서 읽기 작업은 EOF를 똑바로 치고 문제를 일으 킵니다. 으로 작업하려면으로 처리하면 eof status가 지워지고 계속됩니다.

끝 부분에 줄 바꾸기를 추가하는 것이 좋습니다. 이 경우

myFile.seekp(ios::beg); 
myFile << f<<"\n"; 

완전한 해결책이 될 것입니다.

+0

위에서 언급 한 내용 만 반복하면됩니다.이 경우 파일 끝에 새 내용을 쓰지 않아야합니까? 그렇지 않다면, 왜? –

+0

@ThiagoMoraes 업데이트되었습니다. – axiom

+0

글쎄, 당신은 대답했고 나는 보지 못했습니다. 내 프록시는 내가 올바른 답변으로 표시하지 못하게하므로 사과하거나 사과합니다. 고맙습니다! –

2

쓰기 전에 파일의 시작 부분까지 되감 으십시오. 그 이외의 경우, 최초의 값 이후에, 2 번째의 값이 가됩니다.

+0

이 경우 새로운 내용을 파일의 끝에 쓰지 않아야합니까? 그렇지 않다면, 왜? –

+1

@ ThiagoMoraes : 숫자 만 파일에 들어 있다고 가정합니다. 사실, 코드를 실행할 때 이것은 정확히 일어납니다. – NPE

+0

내 시스템에서 이것은 2 회만 발생합니다. 그 후에는 파일을 업데이트하지 않습니다. 항상 작동되게하려면 오류 상태를 지워야합니다. 내 대답이 업데이트되었습니다. – axiom

-1

이 줄과 관련이 있습니다.

myFile >> f;

제거하고 모든 것이 올바르게 작동합니다. 나는 fstream에 익숙하지 않지만이 코드는 문자열을 길게 만들려고한다. 나는 또한 그것을 길게 던지도록 허락되지 않았기 때문에 이것이 결코 이런 처형을 의미하지 않는다고 생각하게 만든다. 긴 형식으로 파일에서 값을 검색 한 다음 다시 시도하는 방법에 대해 읽어 보시기 바랍니다.

편집 :
this 사이트를 읽고 나면 읽기와 쓰기 사이에 파일을 닫았다가 다시 열어야한다고 제안했는데 실제로 고쳐졌습니다. 내가 잘못 여기서 무엇을하고 있었는지 생각

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 

using namespace std; 

int main(int argc, char* argv[]) { 

    long f; 

    fstream myFile("data.txt", fstream::in|fstream::out); 
    cout << "f before: " << f << endl; 
    myFile >> f; 
    cout << "f after: " << f << endl; 
    f++; 
    cout << "f after increment: " << f << endl; 
    myFile.close(); 
    myFile.open("data.txt", fstream::in|fstream::out); 

    myFile << f; 
    myFile.close(); 

    return 0; 
} 
+0

-1 : 아무 문제가 없습니다. 정확하게 (형식화 된) 스트림에서 '길다란'것을 얻으려면 어떻게해야할까요? – Angew

+0

내가 말했듯이, 나는 fstream에 익숙하지 않다.하지만 나는 그 라인을 지우면 그 라인을 지킬 때 파일에 쓸 수 없다. 내가 진실하지 않은 것을 말하지 않았기 때문에 나는 왜 하향 투표를 받았는지 확신하지 못한다. – Kevin

+0

글쎄, 당신은 "이 코드는 긴 문자열을 강제하려고 할 것"이라고 말했고 "이것처럼 결코 실행되지는 않을 것입니다. 나는 파일에서 값을 검색하는 방법에 대해 읽으시기 바랍니다. 긴 타입. " 이것은'myFile >> f;'*가 * 긴 형식의 파일에서 값을 검색하는 정확한 방법입니다. "(오리지널) 답변을 오도하게 만듭니다. – Angew

0

:

하지만, 내가 fstream 어쨌든 .... 읽기 또는 쓰기 또는 모두에 의미가 있다고 생각 나는 왜 여기 작업 코드입니다, 도움이되지만 궁금 수 없습니다

내 파일에는 나중에 읽고 쓰고 싶을 때까지만 포함되어있었습니다. 파일을 읽을 때 EOF에 도달 한 다음 끝에 아무것도 감을 수 없거나 쓰지 못했습니다.

그렇다면 내 해결책은 파일 끝에 공백이나 \ n을 포함시키는 것이 었습니다.

API가 이런 식으로 작동하는 이유를 아는 사람이 있습니까? 나를 위해 매우 유용하지 않습니다.

+0

>> 연산자는 개행까지 읽습니다. 그것이 이해할 수없는 것을 읽으면 실패 비트가 설정됩니다. 그것이 정확하게 당신이 쓰기 전에 clear()를 호출해야만했던 이유입니다. 또한 질문을 편집하여이를 포함 할 수도 있습니다. – axiom

관련 문제