macer pisze:Zacząłem przepisywać pewien algorytm z php, narazie mam tyle:
Kod: Zaznacz cały
#include <iostream>
#include <gd.h>
#include <cstring>
#include <cstdlib>
using namespace std;
int main(int argc,char* argv[])
{
FILE *in = fopen("plik.jpg","r");
FILE *out = fopen("zakodowany.png","w");
gdImagePtr image = gdImageCreateFromJpeg(in);
char* tekst = "Hello coding world :-)";
cout << strlen(tekst);
}
Problem w tym że przy uruchamianiu programu dostaję "Segmation fault".
Myślę że to przez to że jakoś źle deklaruje "tekst", może trzeba dodać "const", czy jeszcze coś innego.
Wie ktoś co na to poradzić?
PS nie mogę zadeklarować jako "string" bo wtedy nie działa "strlen(tekst)".
const char* wyrzuci Ci tylko ostrzeżenie z logów, ale problemu nie załatwi, bo to nie o to chodzi.
Błąd tu polega na tym, że plik.jpg nie istnieje, i się nie otworzył, a chcesz z niego czytać gdImageCreateFromJpeg (z pustego i Salomon nie naleje ;p). Następnym razem sprawdzaj czy plik który otwierasz istnieje:
Kod: Zaznacz cały
if(!in){printf("plik nie istnieje"); exit(0);}
else{
//wszystko ok można czytać z pliku
}
EDIT:
thalcave pisze:Kod: Zaznacz cały
string text = "To jest moj tekst";
cout << text.length() << endl;
działa - Pamiętaj stroing to klasa a nie typ zmiennej.
Poza tym w C++ wczytywanie/zapis do pliku odbywa się tak (tak mnie przynajmniej uczono) - szybciej de facto:
Działa - tylko po co w tym wypadku korzystać z std::string, skoro zupełnie nie w tym tkwi problem?
Czyli nie nauczono Cię, że C++ zawiera w sobie C, a funkcje, które pokazałeś spowalniają bardzo odczyt/zapis (jest stosowana synchronizacja) - można niby zmniejszyć różnicę przez wyłączenie synchronizacji wejścia/wyjścia (ios_base::sync_with_stdio(0);), ale dalej wydajność jest niższa niż w przypadku odpowiedników z C.
Swoją drogą nie da się użyć strumieni C++ w tym wypadku, bo biblioteka GD jest pisana w C i użyta funkcja wymaga uchwytu do pliku (FILE*)