문제
이 코드를 사용하면 문자열 "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를 사용하여 구조를 숯* 유형으로 타이핑합니다.