PDA

View Full Version : [c++] ifstream di un file su internet


kk3z
10-06-2004, 12:43
E' possibile leggere un file da internet con l'ifstream?
C'è una possibilità remota che il dos possa collegarsi a internet?

del tipo ifstream file("http://www.ciao.com/ciao.txt") ?

fermatemi se sto dicendo un'assurdità :D

/\/\@®¢Ø
10-06-2004, 13:14
no, un ifstream non va bene (a meno di non avere un S.O. che permette di vedere nativamente indirizzi web come percorsi nel file system).
Ci sono pero' delle librerie che permettono di ottenere un generico per un socket e probabilmente pure per una sessione http. Prova a controllare con google.

kk3z
10-06-2004, 15:19
Originariamente inviato da /\/\@®¢Ø
Ci sono pero' delle librerie che permettono di ottenere un generico per un socket e probabilmente pure per una sessione http.che cos'è un generico per un socket ma soprattutto cos'è un socket?

Prova a controllare con google. non ho ben chiaro cosa devo cercare...

kk3z
10-06-2004, 15:36
se fosse in windows sarebbe più semplice o lo stesso?

cionci
10-06-2004, 19:26
Lo stesso... Ma il tuo preblema è fare una sessine HTTP ? Su Windows trasferire un file HTTP è facilissimo con la API giusta...

kk3z
11-06-2004, 00:09
in realtà devo farlo semplicemente leggere dal programma (cioè senza che io possa vedere dove l'ha preso)
cmq se non si può in dos o è troppo complicato lascio perdere, non è strettamente necessario ;)

cionci
11-06-2004, 08:16
Con le API InternetOpen, InternetOpenUrl, InternetReadFile e InternetCloseHandle fai un batter d'occhio...

kk3z
11-06-2004, 10:41
non sono api per windows? il mio prog è in dos :rolleyes:

cionci
11-06-2004, 19:44
Dos o console di testo ? Se è un programma a 32 bit per la console di testo puoi usare le API...

kk3z
11-06-2004, 22:05
Originariamente inviato da cionci
Dos o console di testo ? Se è un programma a 32 bit per la console di testo puoi usare le API...
che differenza c'è fra i due? e in quale caso posso usarlo? :)

cionci
11-06-2004, 23:53
Che compilatore usi ?

kk3z
12-06-2004, 12:12
dev-c++

cionci
12-06-2004, 13:11
Allora non fai programmi in DOS, ma li fai per Windows, anche se sono in testo... Quindi puoi tranquillamente usare quelle API... Vai su http://msdn.microsoft.com per cercare la documentazione di quelle API...

kk3z
12-06-2004, 16:03
bof nn capisco cosa ha di sbagliato sto codice... mi dà un po' di errori

devo dire che non ho mai usato api o handle vari, soprattutto integrati in un file per console di testo


#include <iostream>

HINTERNET hFile, hNet;
DWORD dwBytesRead = 0;
char buffer[10*1024];
BOOL bRead;

hNet = InternetOpen(
"Microsoft Internet Explorer",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0
);

if (hNet == NULL)
{
cout<<"Devi connetterti a internet"<<endl;
return 0;
}

hFile = InternetOpenUrl(
hNet,
"http://xmax.altervista.org/tictac.txt",
NULL,
0,
INTERNET_FLAG_RELOAD,
0
);

if (hFile == NULL)
{
cout<<"Non ho trovato il file, chiudo"<<endl;
return 0;
}

bRead = InternetReadFile(
hFile,
buffer,
sizeof(buffer),
&dwBytesRead
);

if (bRead == TRUE)
{
cout<<"File ricevuto, elaboro le domande";
................
}
else
{
cout<<"File vuoto, riprova";
return 0;
}

InternetCloseHandle(hNet);
InternetCloseHandle(hFile);

posso usare il file che ha letto (il buffer?) in un ifstream?

cionci
12-06-2004, 16:06
Devi includer windows.h e Wininet.h...poi devi linkare al tuo eseguibile libwininet.a ;)

kk3z
12-06-2004, 16:33
ahhhhhhhhhhhh mi fa venire il mal di testa

mi dice che sto traformando il void* di HINTERNET hNet in int :confused: :confused: :confused: e così anche per gli altri handle

mi fai vedere un esempio veloce veloce? non ho trovato esempi e nn ci sto capendo niente

cionci
12-06-2004, 16:36
Il tuo codice dovrebbe andre bene... Nnon so il perchè di questi errori...

cionci
13-06-2004, 09:36
Guarda...non ho messo mano al codice e funziona perfettamente ;)

#include <iostream>
#include <windows.h>
#include <wininet.h>

using namespace std;

int main()
{

HINTERNET hFile, hNet;
DWORD dwBytesRead = 0;
char buffer[10*1024];
BOOL bRead;

hNet = InternetOpen(
"Microsoft Internet Explorer",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0
);

if (hNet == NULL)
{
cout<<"Devi connetterti a internet"<<endl;
return 0;
}

hFile = InternetOpenUrl(
hNet,
"http://forum.hwupgrade.it/images/smilies/icon_wink.gif",
NULL,
0,
INTERNET_FLAG_RELOAD,
0
);

if (hFile == NULL)
{
cout<<"Non ho trovato il file, chiudo"<<endl;
return 0;
}

bRead = InternetReadFile(
hFile,
buffer,
sizeof(buffer),
&dwBytesRead
);

if (bRead == TRUE)
{
cout<<"File ricevuto, elaboro le domande";
}
else
{
cout<<"File vuoto, riprova";
return 0;
}

InternetCloseHandle(hNet);
InternetCloseHandle(hFile);
return 1;
}

kk3z
13-06-2004, 14:40
te lo compila? a me dà errore

[Linker error] undefined reference to `InternetOpenA@20'
[Linker error] undefined reference to `InternetOpenUrlA@24'
[Linker error] undefined reference to `InternetReadFile@16'
[Linker error] undefined reference to `InternetCloseHandle@4'
[Linker error] undefined reference to `InternetCloseHandle@4'

questo è il log completo degli errori

C:\WINDOWS\TEMP/ccs2obeb.o(.text+0x119):connessione internet.cpp: undefined reference to `InternetOpenA@20'
C:\WINDOWS\TEMP/ccs2obeb.o(.text+0x175):connessione internet.cpp: undefined reference to `InternetOpenUrlA@24'
C:\WINDOWS\TEMP/ccs2obeb.o(.text+0x1ce):connessione internet.cpp: undefined reference to `InternetReadFile@16'
C:\WINDOWS\TEMP/ccs2obeb.o(.text+0x220):connessione internet.cpp: undefined reference to `InternetCloseHandle@4'
C:\WINDOWS\TEMP/ccs2obeb.o(.text+0x22e):connessione internet.cpp: undefined reference to `InternetCloseHandle@4'

eppure l'ho copiato pari pari al tuo, il wininet.h c'è...
è come se nn vedesse il file che gli ho detto di includere :boh:

kk3z
13-06-2004, 14:58
il bello è che se gli dò altri errori del tipo tolgo using namespace std non li trova sti benedetti errori di linker! che sia il compilatore?

cionci
13-06-2004, 15:00
using namespace std lo devi usare, altrimenti non ti trova cout !!!
Devi linkare libwininet.a dalle opzioni del linker...

kk3z
13-06-2004, 15:14
:winner:

kk3z
13-06-2004, 15:23
:D :D :D






ok ora ho un buffer, che però non essendo un file non posso usare ifstream
dovrei separare ogni riga che corrisponde ad una domanda, e poi fare il random di ste domande e scrivere la domanda a schermo

forse è meglio scaricare il file? però poi devo cancellarlo!

ps: cionci for president! :) grazie mille! ;)

kk3z
13-06-2004, 15:24
ah il buffer è un char

cionci
13-06-2004, 15:36
Usa la classe stringstream...

Metti il terminatore di stringa ('\0') nel buffer alla posizione che corrisponde alla lunghezza della stringa...

stringstream s;
s << buffer;

Ed ora ti fa la scansione linea per linea con getline...

string linea;
getline(s, linea);

kk3z
14-06-2004, 15:21
ok perfetto, sono riuscito a fare proprio quello che volevo. :)