[ C++ fstream write ] string 작성시 마지막 글자에 \0을 삽입하려면 어떻게 해야할까요?

조회수 1546회

아래 코드는 파일에 쓰여있는 Customer라는 글자를 Admin이라는 글자로 바꾸는 코드입니다.

끝이 NULL로 잘 처리가 안 된것인지 Admin이 아니라 기존의 텍스트(Customer)와 겹쳐서 Adminmer가 되어버립니다.

Customer의 글자수가 더 많기 때문에 Admin에서 Customer로 바뀌는데는 지장이 없습니다.

바꾸기 전의 글자수가 바꾸고 싶은 글자수보다 이처럼 적은 경우는 문자의 뒷 부분이 기존 글씨와 글씨가 겹치는데 어떻게 해야할까요?

NULL을 제대로 삽입을 해야할 거 같긴한데.. 어찌해야할지 모르겠네요.

(Admin + 띄어쓰기가 아니라 딱 Admin까지만 나오게 하고 싶습니다.)

    fstream fs;
    fs.open(getLoginedID() + ".dat", /*fstream::binary |*/ fstream::in | fstream::out);

    string str((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
    size_t pos = str.find("Customer");

    if (pos != string::npos) {
        cout << "string found at position: " << int(pos) << endl;
        fs.seekp(pos);
        fs << "\nAdmin";      
        fs.put('\0');
        //fs.write("\nAdmin\0", 7); 이 방법으로도 되지 않음
    }
    fs.close();
}
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 파일을 통채로 읽어 어디 넣은 다음 거기서 Replace 하시고 다시 통째로 쓰는 방법이 가장 쉬운데... 성능이 중요한 코드인가요? NULL을 삽입하는게 가능하다고 해도 바이너리 상으론 남아있을것 같은데... 알 수 없는 사용자 2016.12.3 16:40

1 답변

  • 성능이 별로 중요하진 않아서 다음과 같이 해결하였습니다. 코드는 의도대로 잘 돌아가지만 다른 문제를 갖고있는지는 잘 모르겠네요 ㅎㅎ

    ifstream userInfoFile;
        ofstream tempFile;
        string strTemp;
        try {
            openFileToRead(userInfoFile, (id + ".dat").c_str());
            openFileToWrite(tempFile, "temp.dat");
            while (userInfoFile >> strTemp)
            {
                if (strTemp == "Customer") {
                    strTemp = "Admin";;
                }
                strTemp += "\n";
                tempFile << strTemp;
            }
        }
        catch (string err) {
            cerr << err << endl;
            exit(EXIT_FAILURE);
        }
        userInfoFile.close();
        tempFile.close();
        remove((id + ".dat").c_str());
        rename("temp.dat", (id + ".dat").c_str());
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)