Tengo un código que lee unas urls de un archivo y luego con por el método GET descarga las webs y las guarda
std::cout << urlname;
manager = new QNetworkAccessManager(this);
QUrl url = QUrl(urlname.c_str());
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onManagerFinished(QNetworkReply*)));
manager->get(QNetworkRequest(url));
std::cin.get();
Aqui es cuando descarga las webs
void downloader::onManagerFinished(QNetworkReply *r)
{
QString filename=filename0.c_str(); //filename0 es el nombre del archivo que se llama temp+i (temp1,temp2,temp3)
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
QTextStream stream( &file );
stream << r->readAll() << endl;
}
file.close();
delete r;
delete manager;
downloader(); //Esto representa la función que hay más arriba para que descargue la siguiente URL
}
EL problema es que la segunda vez que entra en la función de guardar el archivo no hace nada.
coge la primera url la guarda coge la segunda url pero ya no hace nada más
Podrías hacer un For para repetir la parte que funciona cambiándole los parámetros para la nueva url, no se me ocurre como arreglarlo. Pruébalo como un apaño temporal a ver si funciona.
De esto:
void downloader::onManagerFinished(QNetworkReply *r)
Deduzco que la clase en la que estás trabajando se llama "downloader", y que estás llamando al constructor de la clase desde la clase misma. Esto puede ser lo que ocasiona el problema, míralo, y si no postea más código porque está un poco incompleto.
Saludos.
Coloque el código dentro del bucle pero entonces coge las 3 urls pero no descarga el contenido de las 3 sino solo de la primera
int i=0;
downloader::downloader(QObject *parent) :
QObject(parent)
{
std::ifstream urls;
urls.open("fuck/config",std::ios::binary);
std::string urlname;
char c;
urls.seekg(0, std::ios::end);
long size = urls.tellg();
urls.seekg(0, std::ios::beg);
long index=0;
while (index!=size)
{
index++;
c = urls.get();
if (c==';') {
manager = new QNetworkAccessManager(this);
QUrl url = QUrl(urlname.c_str());
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onManagerFinished(QNetworkReply*)));
manager->get(QNetworkRequest(url));
urlname="";
} else {
urlname = urlname + c;
}
}
urls.close();
}
void downloader::onManagerFinished(QNetworkReply *r)
{
std::stringstream stream;
stream << i;
std::string filename0;
filename0 = "fuck/temp";
filename0 += stream.str()+".html";
i++;
QString filename=filename0.c_str();
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
QTextStream stream( &file );
stream << r->readAll() << endl;
}
file.close();
delete r;
}
Será culpa del espacio o el salto de lineas entre urls? Prueba simplemente a imprimir en pantalla las urls que le indiques sin realizar ninguna operación con ellas. Si solo imprime la primera la culpa es de la manera de almacenar las urls, ya sea la forma de tomarlas o las variables que se usen.
Es una comprobación muy simple pero así podemos centrarnos en el culpable sin tener que mirar todo el código.
Ya lo probé y devuelve la primera URL la carpeta destino luego imprime la segunda URL y ya no devuelve nada más.
Gracias de todos modos
No me entero del código pero ¿no será que al acabar la conexión con la primera url se cierra y hay que volver a abrirla?
Comprueba a ver..
Comprueba las URLs, el modo de apertura del archivo de URLs, procura liberar la memoria del manager, y fíjate que en las primeras iteraciones del bucle obtendrás una URL válida si está en el archivo como tú quieres, pero luego le sigues sumando caracteres al string urlname sin haberlo limpiado antes, y lógicamente no te funciona.
no funciona con nada. El error esta en el manager. Cuando carga la primera url la carga bien pero la segunda no escribe nada probé a poner delete manager; y manager->disconnect; pero no ha funcionado.
Ya lo arregle. Gracias a 0xDanni vi que el error era al pasarlo a QUrl y vi que cuando mandaba la petición acababa con un %0D así que hice un for (int i=0;i<urlname.size()-1;i++) y ya no dio error.
Gracias a todos por vuestra ayuda.