Jak zamienić char* na string? I na odwrót? Są do tego specjalne funkcje?
const char* c = "ala ma kota";
string s(c);
const char* d = s.c_str();
No no, z tym drugim to bym uważał. Wynik c_str() jest gwarantowany TYLKO w czasie wywołania funkcji. Później już nie i trzymanie takiego wskaźnika to proszenie sie o guza.
Ja chce przekonwertować z string do char* nie const char* bo funkcja do zapisu plików potrzebuje takiego typu argumentu.
class CFile
{
public:
bool LoadFile(std::string path);
void SaveFile(std::string path);
void SaveFile(std::string path, char* buff, int len);
~CFile();
char * buffer;
int length;
};
bool CFile::LoadFile(std::string path)
{
std::fstream file;
file.open( path, std::ios::binary | std::ios::in );
if ( file.good() )
{
file.seekg( 0, std::ios::end );
length = file.tellg();
file.seekg( 0, std::ios::beg );
buffer = new char [length];
file.read( buffer, length );
//std::cout << &buffer;
file.close();
return 1;
}
return 0;
}
void CFile::SaveFile(std::string path)
{
std::fstream file( path, std::ios::out | std::ios::binary);
file.write( buffer, length );
file.flush();
file.close();
}
void CFile::SaveFile(std::string path, char* buff, int len)///TA FUNKCJA
{
std::fstream file( path, std::ios::out | std::ios::binary);
file.write( buff, len );///TUTAJ
file.flush();
file.close();
}
CFile::~CFile()
{
delete [] buffer;
}
Shalom napisał(a):
No no, z tym drugim to bym uważał. Wynik c_str() jest gwarantowany TYLKO w czasie wywołania funkcji. Później już nie i trzymanie takiego wskaźnika to proszenie sie o guza.
Nieprawda.
Zasady unieważniania tego wskaźnika sa takie same jak zasady unieważniania iteratorów dla std::string
. Czyli są 2 przypadki:
- Jeżeli obiekt tej klasy zostanie użyty jako argument funkcji z biblioteki standardowej, przekazany przez referencję która nie ma
const
. - Jeżeli wywołana zostanie funkcja składowa klasy, która nie jest
const
.
(21.4.1.5)
Mam
char * buffer;
tworze tablice
buffer = new char [length];
zapisuje
file.write( buffer, length );
i chciałbym to przenieść do stringa;
std::string str;
Ale nie wiem jak.
Przenieść do string'a to co zapisałeś już do pliku, po kiego?
pseudokod: do nowej zmiennej przypisz starą zmienną char jako string
Ja chciałbym napisać aplikacje, która wczyta plik (dowolny), do tego ta klasa, prześle ją przez internet używam do tego pakietów sfml a ładuje do nich std::string bo char* array jest trudniej. A że jak pisałem klasa wczytująco/zapisująca dane działa na char* to przed wysłaniem i po wysłaniu muszę konwertować string/char*.
Konwersje zrobiłem tym sposobem:
std::string str(file.buffer);
Ale kopiuje się tylko 8 znaków.
Jak sprawdzałem rozmiar string to przy wczytanym pliku ponad 20 000 bajtów string ma tylko 8 znaków. Nie wiem dlaczego, i nie wiem co z tym zrobić.
Ale jak zrobię tak to string ma więcej niż osiem znaków.
std::string str("dlugitekstdostringa");
Jeżeli kopiuje się tylko 8 znaków to znaczy że 8-y znak jest znakiem końca napisu.
Zacznij używać do tego celu strumieni, np stringstream
Przepisanie z jednego strumienia do drugiego jest błyskawiczne.
Nie za bardzo mi wychodzi string ma tylko cztery znaki.
Próbuje tak:
ss << file.buffer; //z char*buffer do strngstream
ss >> str; //z stringstream do std::string
:/
dodanie znacznika <code class="cpp">
- @furious programming
Nie wiem czy o to chodzi bo trochę piszesz na okrętkę:
// czyta tylko pliki tekstowe
void readTextFileToString(const string &fname, string &output)
{
std::ifstream infile(fname.c_str());
// allocare enough memory in string
infile.seekg(0, std::ios::end);
output.reserve(infile.tellg());
infile.seekg(0, std::ios::beg);
// return result
output.assign((std::istreambuf_iterator<char>(infile)),
std::istreambuf_iterator<char>());
}
użycie:
string s;
readTextFileToString("mojplik.txt", s);
cout << "plik: " << s;
string readAllFile(const string &fname)
{
std::ifstream fin(fname.c_str());
std::ostringstream sout;
sout<<fin.rdbuf();
return sout.str();
}
Ja wczytuje plik binarnie do tablicy.
char* buffer
///
buffer = new char [llenght];
// ładowanie pliku
I chciałbym go przesłać sf::Packet tylko, że łatwiej będzie mi przesyłać std::string niż char* tylko chciałbym z cha* do std:string przekonwertować by spakować to pakietu.
Musze przkonwertować char* do string i nie wiem jak.
A gdy będę chciał zapisać to będę musiał przekonwertować te strumienie?
Przecież praktycznie to samo:
void writeAllFile(const string &fname,const string &content)
{
std::istringstream sin(content);
std::ofstream fout(fname.c_str());
fout<<sin.rdbuf();
}
Można też zrobić tak:
void writeAllFile(const string &fname,const string &content)
{
std::ofstream fout(fname.c_str());
fout.write(&content[0],content.length());
}
Gdy wczytuje plik i próbuje go zapisać tą funkcją (wyżej) to plik (tu akurat obraz) jest uszkodzony.
void writeAllFile(const string &fname,const string &content)
{
std::ofstream fout(fname.c_str());
fout.write(&content[0],content.length());
}
Wywołuje:
int main()
{
std::string load;
load = ReadFile("abc.jpg");
WriteFile("abc1.jpg", load);
return 0;
}
Wiem że chodzi o tę linijke.
fout.write(&content[0],content.length());
http://www.cplusplus.com/reference/ostream/ostream/write/
Nie wiem jak przerobić ten kod tak by działał;
Próbowałem:
void WriteFile(const std::string &fname,const std::string &content)
{
std::ofstream fout(fname.c_str());
for(int i = 1; (content.length()+1); i++)
fout.write(&content[i-1],content.length());
fout.close();
}
Ale program przestaje działać a zapisany plik jest większy niż oryginał. :/
Myślałem by spróbować z tablicami ale nie potrafie przekonwertować z string do const char *
Podpowie ktoś coś?
std::string ReadFile(const std::string &fname)
{
std::ifstream fin(fname.c_str(), std::ifstream::binary);
std::ostringstream sout;
sout << fin.rdbuf();
fin.close();
return sout.str();
}
void WriteFile(const std::string &fname,const std::string &content)
{
std::ofstream fout(fname.c_str(), std::ifstream::binary);
fout.write(content.c_str(),content.length());
fout.close();
}