Jak zamienić char* na string i na odwrót?

0

Jak zamienić char* na string? I na odwrót? Są do tego specjalne funkcje?

1
const char* c = "ala ma kota";
string s(c);
const char* d = s.c_str();
4

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.

0

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;
}
3
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)
0

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.

0

Przenieść do string'a to co zapisałeś już do pliku, po kiego?

0

pseudokod: do nowej zmiennej przypisz starą zmienną char jako string

0

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");
0

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.

0

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

0

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;
0
string readAllFile(const string &fname)
  {
   std::ifstream fin(fname.c_str());
   std::ostringstream sout;
   sout<<fin.rdbuf();
   return sout.str();
  }
0

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.

0

A gdy będę chciał zapisać to będę musiał przekonwertować te strumienie?

1

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());
  }
0

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ś?

0
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();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1