C++ och filer på internett.

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

C++ och filer på internett.

Inlägg 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
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Inlägg 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 ??
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg 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]
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Hmm. Det blevlite komplicerat nu :shock:, 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.
Användarvisningsbild
Icecap
Inlägg: 26136
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Inlägg av Icecap »

Men... är det inte just vad BoF's rutin gör?
micke.prag
Inlägg: 79
Blev medlem: 22 juni 2006, 16:11:17
Ort: Lund
Kontakt:

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Inlägg 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.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg 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;

}
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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.
SvenW
Inlägg: 1122
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Och är dessutom ett svenskt projekt, libcurl.
Wget - 'The non-interactive network downloader', är också något att kolla upp.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
jbulow
Inlägg: 114
Blev medlem: 22 juni 2006, 21:35:26
Ort: Malmö

Re: C++ och filer på internett.

Inlägg 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'
Skriv svar