0 und leerzeichen in ausgabe kicken

Hallo,

ich rufe hiermit eine php auf dem Server auf

Code:
int main()
{ 
HINTERNET connect = InternetOpen(0, 0, 0, 0, 0);     
 if(!connect){          
}  
 HINTERNET OpenAddress = InternetOpenUrl(connect,"http://www.exapmple.com/file.php", 0, 0, 0, 0);      
if ( !OpenAddress )    {       DWORD ErrorNum = GetLastError();       
InternetCloseHandle(connect);          
 }     
 char DataReceived[4096];    
DWORD NumberOfBytesRead = 0;    
while(InternetReadFile(OpenAddress, dDataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )    
{
 DataReceived[NumberOfBytesRead]='\x00';           
cout << DataReceived;    
}     
 InternetCloseHandle(OpenAddress);   
 InternetCloseHandle(connect);  
ofstream datei; datei.open("output.txt"); 
datei << DataReceived   
system("PAUSE")   
}


Bis auf eine Kleinigkeit geht das auch, in der php ist ein einzeiler mit echo "hello world";

Aber in der output.txt steht


Wo liegt das Problem?

Ich mache das mit Visual C++ Express
 
Zuletzt bearbeitet:
Code:
while(InternetReadFile(OpenAddress, dDataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )    
{
 DataReceived[NumberOfBytesRead]='\x00';           
cout << DataReceived;    
}
Sicher, dass das korrekt ist?
http://msdn.microsoft.com/en-us/library/windows/desktop/aa385103(v=vs.85).aspx hat gesagt.:
To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.
d.h beim letzten Call wird 0 Bytes gelesen und ein True zurückgegeben, dabei wird in Deiner Schleife der Anfang des Buffers mit 0 überschrieben.

Zudem wird dieser Ansatz nicht klappen, wenn die Daten in mehreren Blöcken gelesen werden (da die vorherigen einfach überschrieben werden) ;)

Sowas in der Art:
Code:
char *bufptr = DataReceived;
int MaxLen = 4096;
int read_count = 0;
while blub
{
  len = MaxLen - read_count;
  blub = read_data(bufptr, len, &num_of_bytes_read);
  bufptr += num_of_bytes_read;
  read_count += num_of_bytes_read;
  if (read_count >= MaxLen) error("Manual memory management sucks ;)")
}
 
Ich kann dir nicht ganz folgen. Ich habe den Code von Stack Overflow
Ich habe das jetzt so versucht, aber das spuckt mir tzausend Fehler aus
Code:
int main()
{ 
HINTERNET connect = InternetOpen(0, 0, 0, 0, 0);     
 if(!connect){          
}  
 HINTERNET OpenAddress = InternetOpenUrl(connect,"http://www.exapmple.com/file.php", 0, 0, 0, 0);      
if ( !OpenAddress )    {       DWORD ErrorNum = GetLastError();       
InternetCloseHandle(connect);          
 }     
 char DataReceived[4096];    
DWORD NumberOfBytesRead = 0;    
char *bufptr = DataReceived;
int MaxLen = 4096;
int read_count = 0;
while blub
{
  len = MaxLen - read_count;
  blub = read_data(bufptr, len, &num_of_bytes_read);
  bufptr += num_of_bytes_read;
  read_count += num_of_bytes_read;
  if (read_count >= MaxLen) error("Manual memory management sucks ;)")
}  
 InternetCloseHandle(OpenAddress);   
 InternetCloseHandle(connect);  
ofstream datei; datei.open("output.txt"); 
datei << DataReceived   
system("PAUSE")   
}

d:\visual studio 2010\projects\neu\neu\main.cpp(28 ): error C2065: 'DataReceived': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(31): error C2061: Syntaxfehler: Bezeichner 'blub'
1>d:\visual studio 2010\projects\neu\neu\main.cpp(33): error C2065: 'len': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(34): error C2065: 'blub': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(34): error C2065: 'len': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(34): error C2065: 'num_of_bytes_read': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(34): error C3861: "read_data": Bezeichner wurde nicht gefunden.
1>d:\visual studio 2010\projects\neu\neu\main.cpp(35): error C2065: 'num_of_bytes_read': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(36): error C2065: 'num_of_bytes_read': nichtdeklarierter Bezeichner
1>d:\visual studio 2010\projects\neu\neu\main.cpp(38 ): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
1>d:\visual studio 2010\projects\neu\neu\main.cpp(37): error C3861: "error": Bezeichner wurde nicht gefunden.
1>d:\visual studio 2010\projects\neu\neu\main.cpp(42): error C2065: 'DataReceived': nichtdeklarierter Bezeichner
 
Zuletzt bearbeitet:
Das sollte auch eher ein Pseudocodeansatz sein, wie man in einer Schleife den Buffer füllt :rolleyes:

Dein vorheriger Code überschreibt in der while schleife jedesmal die gelesenen Zeichen von Anfang an.
So wird zumindest die Ausgabe funktionieren:
Code:
 char DataReceived[4096];    
DWORD NumberOfBytesRead = 0;    
InternetReadFile(OpenAddress, dDataReceived, 4096, &NumberOfBytesRead);
DataReceived[NumberOfBytesRead]='\x00';           
cout << DataReceived;
Das Problem: niemand garantiert, dass die Daten in einem Rutsch übermittelt werden (oder kleiner/gleich 4096 chars sind).
Daher die Schleife.

Die einfachere Lösung (statt mit Buffern zu hantieren) wäre wohl, die erhaltenen Daten direkt zu speichern:
Code:
code wie im ersten Posting, nur die Datei vor der Schleife öffnen
while(InternetReadFile(OpenAddress, dDataReceived, 4096, 
        &NumberOfBytesRead) && NumberOfBytesRead) {        
    data << DataReceived;    
}

Oder man nutzt gleich curl/wget - sollte einfacher/zuverlässiger sein.
 
Vielen Dank,

ich bin schon ein ganzes Stück weiter.

Code:
int main()
{
 
HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0);
 
   if(!connect){
      cout<<"Connection Failed or Syntax error";
      return 0;
   }
 

HINTERNET OpenAddress = InternetOpenUrl(connect, http://www.example.de/file.php", 0, 0, 0, 0);
 
  if ( !OpenAddress )
   {
      DWORD ErrorNum = GetLastError();
      cout<<"Failed to open URL \nError No: "<<ErrorNum;
      InternetCloseHandle(connect);
      return 0;
   }
 
   char DataReceived[4096];
   DWORD NumberOfBytesRead = 0;
	ofstream datei;
    datei.open("datei.txt");
 
   while(InternetReadFile(OpenAddress, DataReceived, 4096, 
        &NumberOfBytesRead) && NumberOfBytesRead) {        
		DataReceived[NumberOfBytesRead]='\x00';
		datei << DataReceived;    
}

		
	 system( "pause" );
}

Ich habe jetzt davor eine Leerzeile. wie bekomme ich die nun weg?

 
Zuletzt bearbeitet:
Ich habe jetzt davor eine Leerzeile. wie bekomme ich die nun weg?
PHP Ausgabe prüfen.
Bzw. was der Server so zurückgibt (mit wget oder im Browser mit "Show Pagesource").


Code:
#include <iostream> 
#include <fstream>
#include <windows.h> 

#include <wininet.h> 
using namespace std;
int main()
{
 
HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0);
 
   if(!connect){
      cout<<"Connection Failed or Syntax error";
      return 0;
   }
 

HINTERNET OpenAddress = InternetOpenUrl(connect, "http://www.utexas.edu/learn/php/ex1.php", 0, 0, 0, 0);
 
  if ( !OpenAddress )
   {
      DWORD ErrorNum = GetLastError();
      cout<<"Failed to open URL \nError No: "<<ErrorNum;
      InternetCloseHandle(connect);
      return 0;
   }
 
   char DataReceived[4096];
   DWORD NumberOfBytesRead = 0;
	 ofstream datei;
    datei.open("datei.txt");
 
   while(InternetReadFile(OpenAddress, DataReceived, 4096, 
        &NumberOfBytesRead) && NumberOfBytesRead) {        
		DataReceived[NumberOfBytesRead]='\x00';
		datei << DataReceived;    
}

		
	 system( "pause" );
}
produziert zumindest keinerlei unerwartete Leerzeilen ;)
 
Zurück
Oben