문제

이 코드를 사용하면 문자열 "Foo"를 이진 형식으로 10 번 인쇄하려고했습니다. 그러나 왜 기능이 작동하지 않습니까?

#include <iostream>
#include <fstream>
using namespace std;

template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
     for (unsigned i = 0; i < St.size(); i++) {
         char CStr = St[i];
         fn.write(&CStr.front(), CStr.size());
     }
     return;
}

int main() {
   string MyStr = "Foo";
   ofstream myfile;
   myfile.open("OuputFile.txt", ios::binary|ios::out);

   // We want to print it 10 times horizontally
   // separated with tab

  for (int i = 0; i < 9; i++) {
      WriteStr2BinFh(Mystr+"\t", myfile);
   }

   myfile.close();   
}
도움이 되었습니까?

해결책

여기에 너무 잘못된 것이 있습니다. 나는 내가 보는 모든 것을 나열 할 것입니다.

루프 조건은 i <10이어야합니다.

템플릿을 사용하는 이유는 있지만 템플릿 매개 변수 T는 사용하지 않습니까?

CSTR에서 메소드 Front ()를 호출하지만 CSTR은 문자열이 아닌 숯이므로 그 컴파일조차 모릅니다.

CSTR이 문자열이라고 가정하면 &를 사용하여 Front () 반복자의 주소를 가져 가고 싶지 않습니다.

fn.write(St.c_str(), St.size());

그리고 당신은 st.size () 반복을 위해 루프를 원하지 않습니다. 위의 일을하십시오.

다른 팁

OMG, 많은 오류가 있습니다.

  • int main- 값을 반환해야합니다.
  • 당신은 당신의 함수에서 <typename t>를 사용하지 않습니다.
  • mystr- 기능 호출에서 올바른 이름이 아니며 C ++의 이름은 사례 sencetive입니다.
  • char cstr- 메소드 프론트가없고 std :: string도 없습니다.
  • 벡터와 같은 첫 번째 요소의 주소를 얻을 수 없습니다.
  • std :: 문자열을 const 참조로 받아들이면 더 나을 것입니다.
  • 스트링 헤더를 포함하는 것을 잊었습니다.
  • ...

코드 구성 및 이름 지정으로 예제를 수정했습니다.

#include <iostream>
#include <fstream>
#include <string>

void WriteStr2BinFh( const std::string& St, std::ostream &out ) 
{
    out.write( St.c_str(), St.size() );
}

int main() 
{
    std::string MyStr = "Foo";
    std::ofstream myfile( "OuputFile.txt", std::ios::binary | std::ios::out );


    for (size_t i = 0; i < 9; ++i) 
    {
        WriteStr2BinFh( MyStr+"\t", myfile );
    }

   myfile.close();   
   return 0;
}

그러나 나는 사용하기 위해 추천했다 std::fill_n 연산

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );

첫 번째, char CStr 그렇게 말합니다 CStr 단일 캐릭터입니다. 초, fn.write(&CStr.front(), CStr.size()); 그 캐릭터를 컨테이너로 취급합니다 std::vector<>, 물론 컴파일 할 수 없습니다.

그 모든 것을 가정합니다 WriteStr2BinFh 확인하지 않은 것은 괜찮습니다. WriteStr2BinFh 볼 수 있어야합니다.

void WriteStr2BinFh(const string& St, ostream &fn)
{
    for(string::iterator it = St.begin(); it != St.end(); ++it)
    {
        fn.put(*it);
    }
}

또는 바람직하게는

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}

이진 모드에서 IO 작업을 수행하기위한 중요한 점 :

  • 플래그 iOS :: OUT (출력 모드) 및 iOS :: BINARY (이진 모드)를 사용하여 파일을 출력 및 이진 모드로 열어야합니다.
  • 함수 쓰기는 두 개의 매개 변수를 취합니다. 첫 번째 매개 변수는 데이터를 작성하기 위해 char*이고 두 번째 매개 변수는 데이터의 크기를 바이너리 파일에 작성하도록 요청하는 유형 int입니다.
  • 파일은 마지막에 닫아야합니다.

    void write_to_binary_file(WebSites p_Data)
    {
        fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
        binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
        binary_file.close();
    }
    

    이 I/O 이진 함수는 기능에 일부 데이터를 씁니다.

  • 파일은 iOS :: out 및 iOS :: Binary를 사용하여 출력 및 이진 모드로 열립니다. 지정자 iOS :: App이 하나 더 있으며, 이는 운영 체제에 파일이 추가 모드에서 열린다는 것을 알려줍니다. 이는 모든 새로운 데이터 세트가 파일 끝에 추가 될 것임을 의미합니다.

  • 위에 사용 된 쓰기 기능은 캐릭터 포인터 유형으로 매개 변수가 필요합니다. 따라서 우리는 유형 변환기 Renterpret_cast를 사용하여 구조를 숯* 유형으로 타이핑합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top