Sida 1 av 1
C++ och filer på internett.
Postat: 22 december 2007, 12:00:47
av squiz3r
Hej, jag tänkte försöka få ett C++ program att läsa från en .txt fil som ligger på ett webhotel. Adressen till den är
http://www.crazycasemod.se/temperature.txt så då testade jag att skriva:
Kod: Markera allt
ifstream inFil;
inFil.open ("http://www.crazycasemod.se/temperature.txt");
Men då blir det bara att den inte kan öppna filen.. Någon som vet varför det inte fungerar och om man kan göra på något annat sätt? jag har som mål att kunna skriva till en fil som ligger på mitt webbhotel också, det borde väll gå?
Mvh
Postat: 22 december 2007, 12:06:41
av sodjan
Ska c++ kunna läsa via http direkt p ådet där sättet ?
Eller varför tror du att det ska fungera ??
Postat: 22 december 2007, 12:09:08
av squiz3r
"Ska c++ kunna läsa via http direkt p ådet där sättet ?"
Det är ju det jag undrar

. Jag är inte så jätte bra på C++.. Finns det något annat sätt så att den inte läser via http?
Tack för snabbt svar!
Mvh
Postat: 22 december 2007, 12:59:57
av BoF
Enkel rutin som hämtar en fil från en webbserver, kan vara en vägledning för dig (antar att du försöker programmera under Windows) använder microsoft API
Var ett tag sen man sysslade med detta men du kan söka info. i MSN webplats.
Kod: Markera allt
#pragma once
class CBFInternetFile
{
public:
CBFInternetFile(void);
~CBFInternetFile(void);
bool ReadFile(char* lpFile);
protected:
BYTE* lpHtmlPage;
DWORD dwHtmlPageLen;
};
Kod: Markera allt
//
// Funktion: bfinternetfile.cpp
// Förklaring: hämtar en fil från internet.
//
#include "StdAfx.h"
#include "bfinternetfile.h"
CBFInternetFile::CBFInternetFile(void)
: lpHtmlPage(NULL)
, dwHtmlPageLen(0)
{
}
CBFInternetFile::~CBFInternetFile(void)
{
delete lpHtmlPage;
}
//
// Funktion: ReadFile
// Förklaring: Läs in en fil från internet.
// Rev: 1.0
//
// Historia: 02-07-09 Rev 1.0 Grund kod
//
bool CBFInternetFile::ReadFile(char* lpFile)
{
// Initiera variabler
HINTERNET hInternet;
HINTERNET hConnect;
DWORD dwReadByte = 0;
DWORD dwByteRead = 0;
BYTE* lpTmp0 = 0;
BYTE* lpTmp1 = 0;
BOOL bRet;
// Kontrollera så vi har en giltlig adress i lpFile
// Anslut till internet sida FEL RUTINER SKALL LÄGGAS IN!
// Öppna en anslutning
hInternet = ::InternetOpen("BFTeknik", INTERNET_OPEN_TYPE_DIRECT,
0, 0, 0);
// Öppna en adress (sida)
hConnect = ::InternetOpenUrl(hInternet, lpFile, NULL, 0,
0, 0); // Fel rutin
// Fråga efter tillgänglig data mängd
::InternetQueryDataAvailable(hConnect, &dwReadByte,0,0);
// Nollställ Html Page minne
dwHtmlPageLen = 0; // Inga byten i lpHttpPage
if(lpHtmlPage != 0)
delete lpHtmlPage;
// Läs in tills 0 byte åter står
if(dwReadByte > 0)
{
do
{
// Reservera temp minne för inläsning
lpTmp0 = new BYTE[dwReadByte];
// Läs tillgänglig data
bRet = ::InternetReadFile( hConnect, lpTmp0, dwReadByte, &dwByteRead);
if(!bRet)
{
dwHtmlPageLen = 0; // Något är fel
break;
}
// Göm undan inläst i html page
if(dwHtmlPageLen > 0)
{
// Reservera temp minne
lpTmp1 = new BYTE[dwHtmlPageLen];
// Kopiera över
for(DWORD i = 0; i < dwHtmlPageLen; i++)
{
lpTmp1[i] = lpHtmlPage[i];
}
delete lpHtmlPage; // Lämna tillbaks minnet
}
// reservera minne för html page som rymmer både tmp1 och tmp0
lpHtmlPage = new BYTE[dwHtmlPageLen + dwByteRead];
DWORD i;
// Adda nya storleken för htmlpage
// Add tmp1 först
for(i = 0; i < dwHtmlPageLen; i++)
{
lpHtmlPage[i] = lpTmp1[i];
}
// Add tmp0 sist
DWORD ii = 0;
for(i = dwHtmlPageLen; i < dwHtmlPageLen + dwByteRead; i++)
{
lpHtmlPage[i] = lpTmp0[ii];
ii++;
}
// Justera reserverat minne för lpHtmlPage
dwHtmlPageLen += dwByteRead;
// Lämna tillbaks temp minne
delete lpTmp0;
delete lpTmp1;
// Kontollera om mer data finns att läsa
::InternetQueryDataAvailable(hConnect, &dwReadByte,0,0);
}
while (dwReadByte >0 );
}
// Stäng internet uppkopplingen
::InternetCloseHandle(hConnect);
::InternetCloseHandle(hInternet);
return true;
}
[/code]
Postat: 22 december 2007, 13:08:50
av squiz3r
Hmm. Det blevlite komplicerat nu

, får läsa igenom det några gånger o se om jag fattar något

.
Så, det finns inga sätt man kan komma åt filen från ftp'n så att man kan behandla den som om den låg internt i datorn?
Mvh.
Postat: 22 december 2007, 14:52:55
av Icecap
Men... är det inte just vad BoF's rutin gör?
Postat: 22 december 2007, 15:16:05
av micke.prag
Ta en titt på biblioteket QT (
www.trolltech.com), där har du QHttp och QFft som är färdiga klasser för just det.
Postat: 22 december 2007, 16:00:58
av sodjan
Du kan kanske också göra ett anrop (system eller vad det nu kallas)
och köra själva FTP session externt, sedan kan du öppna den lokala
kopian från din kod.
Postat: 22 december 2007, 17:04:00
av BEEP
Du kanske kan använda dig av URLMon.
Jag hittade kod på Google men eftersom jag inte håller på med C++ så vet jag inte om den fungerar.
Kod: Markera allt
#include <urlmon.h> //Must add the urlmon.h to project or URLDownloadToFile will not work.
#pragma comment(lib, "urlmon.lib") //Must add the lib file to project or URLDownloadToFile will not work.
int main()
{
HRESULT hr = URLDownloadToFile ( NULL, "http://www.crazycasemod.se/temperature.txt", "C:\\temperature.txt", 0, NULL );
return 0;
}
Postat: 22 december 2007, 18:51:19
av speakman
Jag brukar använda
libcurl för att köra HTTP. Den klarar dessutom mängder med andra protokoll samt krypterade anslutningar. Och är grymt enkelt att använda.
Postat: 22 december 2007, 21:04:06
av SvenW
Och är dessutom ett svenskt projekt, libcurl.
Wget - 'The non-interactive network downloader', är också något att kolla upp.
Postat: 22 december 2007, 22:41:11
av squiz3r
Tack för alla svar! Jag ska läsa igenom det och se om jag lyckas med något

.
Återkommer troligen med fler frågor
Mvh
Re: C++ och filer på internett.
Postat: 25 december 2007, 15:22:01
av jbulow
squiz3r skrev:Hej, jag tänkte försöka få ett C++ program att läsa från en .txt fil som ligger på ett webhotel. Adressen till den är
http://www.crazycasemod.se/temperature.txt så då testade jag att skriva:
Kod: Markera allt
ifstream inFil;
inFil.open ("http://www.crazycasemod.se/temperature.txt");
...
Om du lever på den abstraktionsnivån drar du fördel av att använda något annat språk än C++, t.ex Ruby:
FTP:
Kod: Markera allt
require 'net/ftp'
ftp = Net::FTP.new('www.crazycasemod.se')
ftp.login
ftp.gettextfile('temperature.txt')
ftp.close
HTTP:
Kod: Markera allt
require 'net/http'
Net::HTTP.get_print 'www.crazycasemod.se', '/temperature.txt'