Zum Inhalt springen

großes Textfile auslesen


Babybaer

Empfohlene Beiträge

Hallo,ich lese mit der Methode 'InternetReadFile' auf meinem Server ein Textfile aus. Bis 32 KB ist das kein Problem. Aber alles was darüber liegt, will nicht. Habe so was noch nicht gemacht. Wie bekomme ich ein x beliebig großes Textfiles in meinen StringDatentyp. Ein kleines Beispiel oder was zum nachlesen wäre nicht schlecht. Danke.

VS7.0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, wieder hart am Schaffen?

Wo tritt der Fehler denn genau auf und was für einen Stringtyp verwendest Du? Eine Zeile Code wäre nicht schlecht um zu sehen, wie Du den Buffer vom String füllst.

Wenn ich davon mal ausgehe, daß Du einen CString beschreiben willst, dann kannst Du mit GetBufferSetLength() die Maximalgröße festlegen - der Inhalt geht dabei übrigens nicht verloren. Danach kannst Du den Stringbuffer direkt beschreiben. Das Füllen mit 0ern ist nur notwendig, wenn man den String bis zum ersten 0er als Stringende clippen will. Ansonsten kann man den String wie ein char-Array verwenden, direkt auf den Speicher zugreifen und mit Zeiger durchiterieren, usw.

Da Dir die Stringlänge vom Internetfile nicht bekannt ist, kannst Du ja mal mit einem 32 KB-Buffer arbeiten, den String resizen und dann in den nächsten 32 KB Block weiter einlesen.

Sobald alles fertig ist die Gesamtstringlänge selber festsetzen oder eben mit ReleaseBuffer() die Stringlänge automatisch passend zurecht schneiden lassen.

	CString string("=8-)");

	// wird nicht verändert beim Resize() des Buffers

	string.GetBufferSetLength(500000);

	// hier wird die Größe festgelegt, Inhalte bleiben erhalten

	ZeroMemory(string.GetBuffer(),string.GetLength());

	// mit 0er-Bytes fürs Clippen auffüllen, sofern benötigt

	memcpy(string.GetBuffer(),"test",4);

	// irgendein teststring

	memcpy(string.GetBuffer()+4,"\0test2",6);

	// hier noch einer, damit man das mit dem 0er richtig sieht

//	string.ReleaseBuffer(); // clippt den String von links bis zum ersten 0er-Zeichen

	string.GetBufferSetLength(10);

	// setzt die Stringlänge "hart" auf die befüllte Größe, damit 0er nicht untergehen

// ACHTUNG! Ausgaberoutinen können abstürzen, wenn man so einen String überreicht!

	string.Replace(0x0,'_');

	// Für eine MessageBox z.B. müßte man die 0er vor der Ausgabe ersetzen

	AfxMessageBox(string);

Übrigens: Ich bin heute zu Hause, kannst mich da ja anrufen, wenn Du noch Fragen hast =8-)

Link zu diesem Kommentar
Auf anderen Seiten teilen



	LPDWORD lpdwFileSizeHigh = NULL;


	volatile char *  szbuffer;

	szbuffer = NULL;

	try

	{


		bResult = FtpSetCurrentDirectory(m_hConnect,csDirectory + _T("/"));


		hFile = FtpOpenFile(m_hConnect, csFileName, GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);

	    if(hFile == NULL) 

		{

			return FALSE;

		}



		pdwFileSize = ::FtpGetFileSize(hFile,lpdwFileSizeHigh);


		if(szbuffer == NULL)

				szbuffer = (char*)::VirtualAlloc(NULL, pdwFileSize+1, MEM_COMMIT, PAGE_READWRITE);


		ASSERT(szbuffer);



		bResult = InternetReadFile(hFile, (void*)(csTest), pdwFileSize, &pdwFileSize);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der VirtualAlloc ist das Problem:

dwSize

[in] Specifies the size, in bytes, of the region. If the lpAddress parameter is NULL, this value is rounded up to the next page boundary. Otherwise, the allocated pages include all pages containing one or more bytes in the range from lpAddress to (lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes both pages to be included in the allocated region.

Es wird nur im Bereich von einem Wortoffset Speicher reserviert, weil immer maximal innerhalb einer Memory-Page Speicher verwendet wird. Diese sind eben maximal 0x10000 Bytes groß. Das bedeutet, hiermit kommst Du nicht weiter. Mach ein normales NEW oder verwendet mehrere 65K-Blöcke und fülle diese hintereinander auf, dann klappt´s auch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Laut MSDN Library liest InternetReadFile nicht zwangsläufig die ganze Datei auf einmal ein. Du musst InternetReadFile solange aufrufen, bis es TRUE zurückgibt und die Anzahl der eingelesenen Bytes 0 ist.

Du darfst übrigens für Parameter 3 und 4 nicht dieselbe Variable benutzen, denn bevor InternetReadFile irgendwas anderes macht, setzt es die Variable, auf die Parameter 4 zeigt, auf 0.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe den BUG bei mir gefunden. Also ich kann jetzt große Files auslesen, leider habe ich nicht darauf geachtet das ich einmal ANSI und UNICODE habe. Deswegen habe ich auch nur einen Teil bzw. irgend welche Zeichen zurück bekommen. Und bei den kleinen Files war es zufällig ANSI. :floet: .

Das Problem besteht jetzt nur noch darin, wie bekomme ich vor dem Auslesen mit, ob es ANSI oder UNICODE ist??? Naja werde es hinbekommen.

Danke noch mal an alle.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...