Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: petr_bures 23. 02. 2020, 20:48:27
-
Tento kód mě vypisuje 6 chyb, proč? Dělal jsem to podle tutoriálu a výsledek tohle >:(
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string filesPath = "\\Users\\Petr\\Documents\\Temp";
vector<string> txt;
int i = 0;
void delfile(const string file){
if (remove(file)) {
cout << "Error!";
}
else {
cout << "Success!";
}
}
void addtxt() {
txt.push_back("aaaaaaaaaaaaaa");
txt.push_back("bbbbbbbbbbbbbb");
}
int main(){
addtxt();
delfile(filesPath + "\\" + txt[i]);
}
Chyba (aktivní) E0413 Neexistuje žádná vhodná funkce pro převod z "const std::string" na "const char *". program C:\program.cpp 14
Chyba C2664 int remove(const char *): Nejde převést argument 1 z: std::string na: const char *. program C:\program.cpp 14
Chyba C2146 Chyba syntaxe: Chybí ; před identifikátorem cout. program C:\program.cpp 14
Chyba C2429 vlastnost jazyka příkazy init-statement v if/switch vyžaduje příznak kompilátoru /std:c++17 program C:\program.cpp 14
Chyba C2059 chyba syntaxe: << program C:\program.cpp 14
Chyba C2181 neplatné else bez odpovídajícího if program C:\program
-
Protože jsi to udělal špatně nebo jde o nějaký vadný tutoriál.
Pravděpodobně to první, když je z první chyby jasné, že ti to nesedí typově...
Ten const char* je klasické céčkové pole, string je trošku složitější kontejner. Můžeš z něj to pole dostat metodou c_str(), ale to moc nechceš. Ono když už máš C++, tak používej C++ a ne C.
-
No to jsi mě nikam neposunul.. :)
-
Ono se těžko posouvá, když vždycky dostaneme jiný kód, než se kterým pracuješ. K té typové chybě jsem se vyjádřil poměrně jasně, nemáš-li další dotazy, tak nevím, jak chceš posunout..
-
pravidla, ktera je vhodna dodrzovat.
* nedelej globalni promenne
* predavej promenne do metod hodnotou, referenci nebo pointerem
* zkus nemichat C a C++
-
V C++ můžete s řetězci pracovat v zásadě dvojím způsobem - buď nízkoúrovňově, což se jedná o buffer se sekvencí bytů ukončený nulovým bytem (neuvažuji teď UTF16 kódování) - pokud tento buffer někam chcete předat, často předáváte jen adresu jeho pořátku (pointer typu char *).
Nebo můžete používat nějaký wrapper nad bufferem, který poskytuje obvyklé řetězcové funkce. Dřív si mnohé knihovny definovaly svůj warpper (QString, wxString, atd.), teď už jeto naštěstí standardizováno v std::string apod. třídách.
V kódu používáte funkci remove(char*), která očekává adresu nízkoúrovňového bufferu, ale vy jí předávat zaobalovací typ.
Musíte tedy v tomto případě předat adresu bufferu, který je zaobalen. std::string na to má metodu c_str(), takže v kódu použijete výraz remove(file.c_str()).
-
A jak poznám, že je to kód pro C a ne pro C++?
-
V C++ můžete s řetězci pracovat v zásadě dvojím způsobem - buď nízkoúrovňově, což se jedná o buffer se sekvencí bytů ukončený nulovým bytem (neuvažuji teď UTF16 kódování) - pokud tento buffer někam chcete předat, často předáváte jen adresu jeho pořátku (pointer typu char *).
Nebo můžete používat nějaký wrapper nad bufferem, který poskytuje obvyklé řetězcové funkce. Dřív si mnohé knihovny definovaly svůj warpper (QString, wxString, atd.), teď už jeto naštěstí standardizováno v std::string apod. třídách.
V kódu používáte funkci remove(char*), která očekává adresu nízkoúrovňového bufferu, ale vy jí předávat zaobalovací typ.
Musíte tedy v tomto případě předat adresu bufferu, který je zaobalen. std::string na to má metodu c_str(), takže v kódu použijete výraz remove(file.c_str()).
Díky a to je řešní, aby se vlk nažral, nebo je to správně?
-
Je to správné řešení, byť není tak hezké, jak bychom v C++ chtěli.
Od novější verze C++17 už existují způsoby mazání souborů, kam se nemusí předávat adresa bufferu (std::filesystem::remove()), ale s tím bych počkal, takový moderní kompilátor nemusíte mít všude, kromě toho byste se musel učit další typy.
-
V C++ nejednou narazíte na to, že ne každá funkcionalita je napsána s ohledem na C++, a tudíž si tu a tam budete muset vypomoci s funkcí, která je pro C a tam pak musíte zkonvertovat typy. Základní knihovna C++ se postupně doplňuje s každou verzí, nicméně není to dokonalé a ve starších verzích kompilátoru se bez C-verzí funkcí neobejdete.
-
nebo pokud jste zacatecnik tak zkuste nejprve Go.
ja delam hlavne v C a C++ a Go se mi zalibilo, je to navrat ke korenum.
-
Dělal jsem to podle tutoriálu
teky není na škodu poskytnout odkaz na ten tutoriál, ať máme srovnání
-
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string filesPath = "\\Users\\Petr\\Documents\\Temp";
vector<string> txt;
int i = 0;
void delfile(const string file){
if (remove(file.c_str())) {
cout << "Error!";
}
else {
cout << "Success!";
}
}
void addtxt() {
txt.push_back("aaaaaaaaaaaaaa");
txt.push_back("bbbbbbbbbbbbbb");
}
int main(){
addtxt();
delfile(filesPath + string("\\") + txt[i]);
}
na string bolo treba zavolať c_str(). (riadok 14)