[gelöst] [Anfänger] File Byte-weise einlesen
-
Hallo,
- ich bin neu in C++ und auch sonst nur wenig bewandert im Programmieren.
- Die Suche habe ich versucht zu bemühen - siehe weiter unten.Folgende Problemstellung:
Ich möchte aus einer Datei zunächst die ersten 80 Byte auslesen und in einer Konsole ausgeben können. Ich weiss von diesen 80 Byte nur, dass es sich um 80 "char" handelt.
Später muss ich dann innerhalb des files "umherspringen" und bestimmte bereiche mit anderen datentypen auslesen...Durch die Suche in diesem Forum fand ich diesen Link:
http://www.c-plusplus.net/forum/39469Das zweite Beispiel Dort klang vielversprechend und ich habe angefangen zu "basteln":
#include <iostream> #include <fstream> using namespace std; // So we can see cout and endl int main() { fstream FileBin("datei.dat", ios::in|ios::out|ios::binary); if (FileBin.is_open()) { // 1. Dateigröße bestimmen. FileBin.seekg(0, ios::end); FileBin.seekg(0, ios::beg); // 2. Puffer anlegen und Datei einlesen. char* pBuffer = new char[80]; FileBin.read(pBuffer, 80); cout<<"mal sehen"<< pBuffer; delete [] pBuffer; } else cout<<"FileBin war nicht open..."; }
meine if anweisung wird nicht true und ich kenne den richtigen befehl nicht.
Wie man sicher sieht, bin ich noch nicht sehr weit in C++, wäre aber für Hilfe dankbar.
-
1. Du bist im falsche Forum - C++ wäre korrekt - hier ist C++/CLI
2. Versuche mal den Pfad zur Datei absolut anzugeben - in 99% der Fälle ist der Pfad falsch
3. Wenn Du die Grösse des Buffers kennst, verwende ein statisch alloziertes Array:char buffer[80] = {};
Edit:
- Initialisierung von buffer hinzugefügt
-
danke für die rasche antwort...
und sorry das es im falschen forum gelandet ist - vielleicht liest ja ein moderator das und verschiebt es? (danke!)
ich habe versucht umzusetzen was du mir geraten hast
int main() { fstream FileBin("S:\\datei.dat", ios::in|ios::out|ios::binary); if (FileBin.is_open()) { // 2. Puffer anlegen und Datei einlesen. char buffer[80] = {}; FileBin.read(buffer, 80); cout<<"mal sehen"<< buffer; delete [] buffer; } else cout<<"FileBin war nicht open..."; }
aber nach wie vor wird die if bedingung nicht true. muss man vielleicht sowas wie filebin.open sagen? bevor man fstream verwendet?
-
aber nach wie vor wird die if bedingung nicht true. muss man vielleicht sowas wie filebin.open sagen? bevor man fstream verwendet?
Nein, muss man eigentlich nicht.
BTW: das delete[] ist bei statisch allozierten Arrays nicht nötig.
-
okay, wenn die datei in meinem projektverzeichnis liegt dann geht es jetzt, aber die kopie auf S:\ (also S:\datei.dat) bekomme ich nicht angesprochen.
versucht habe ich es mit:
fstream FileBin("S:\\datei.dat", ios::in|ios::out|ios::binary); // weil es so im beispiel steht fstream FileBin("S:\datei.dat", ios::in|ios::out|ios::binary); //weil es so in der dos konsole steht (cmd) fstream FileBin("S:/datei.dat", ios::in|ios::out|ios::binary); // weil ich das noch nicht probiert hatte fstream FileBin("S://datei.dat", ios::in|ios::out|ios::binary); // verzweifeltes umdrehen von slashes...
EDIT: nachdem ich jetzt wieder in S:\datei.dat geändert habe geht es auf einmal...
hier mein Erfolgserlebnis...
#include <iostream> #include <fstream> using namespace std; int main() { fstream FileBin("S:\datei.dat", ios::in|ios::out|ios::binary); //? if (FileBin.is_open()) { char buffer[80] = {}; FileBin.read(buffer, 80); cout<<"mal sehen"<< buffer; } else { cout<<"FileBin war nicht open..."; } }
jetzt habe ich noch ein paar neue Fragen:
1.) innerhalb der 80 chars kommen manchmal "/n" vor, wie verhindere ich das bei der Ausgabe mit cout ein Zeilenumbruch stattfindet?
2.) muß ich den fstream FileBin noch closen? wenn ja, wie?
-
2.) muß ich den fstream FileBin noch closen? wenn ja, wie?
Nein. Der Stream wird automatisch geschlossen sobald er zerstört wird (d.h. wenn er aus dem Scope geht).
-
danke nochmals!
zum problem 1) habe ich selbst nochmal was ausprobiert:
for (int i = 0; i <80; i++) { cout<<buffer[i]; }
leider bringt das nicht das gewünschte resultat, offenbar wird ab dem ersten / nichts mehr ausgegeben... oder es ist eventuell ausserhalb der konsole?
um das zu testen habe ich folgendes ausprobiert:
cout<< endl; for (int i = 0; i <10; i++) { cout<<"0123456789"; }
Das ergebnis zeigt das 80 zeichen in die konsole passen.
http://screencast.com/t/sKFwQNGiP
-
jetzt wird es doch noch einmal kurios...
ich habe mich gewagt eine datei2.dat im selben verzeichnis zu erstellen (also direkt auf laufwerk s:\)
durch herumprobieren habe ich nun herausgefunden, das ich datei2.dat so ansprechen muß:
fstream FileBin("S:\\datei2.dat", ios::in|ios::out|ios::binary); //?
wohingegen das hier nicht funktioniert:
fstream FileBin("S:\datei2.dat", ios::in|ios::out|ios::binary); //?
gleichzeitig verhält es sich bei der alten datei.dat umgekehrt, die will nur ein backslash und geht mit zweien nicht auf... ich bin mal wieder verwirrt.
-
Das "kann eigentlich nicht sein".
Korrekt ist definitiv die Variante mit"\\"
. (EDIT: argh, das Forum hatte den zweiten \ gefressen!) /EDIT
\ leitet in C++ in String-Literalen eine Escape-Sequence ein, und "\d" ist keine gültige Escape-Sequence.Du solltest also zumindest eine Warnung vom Compiler bekommen. Was der Compiler dann für einen String draus macht, weiss ich nicht (keine Ahnung ob das überhaupt definiert ist, ich würde eher schätzen dass es undefiniert ist).
Achja, nochwas:
theta schrieb:
BTW: das delete[] ist bei statisch allozierten Arrays nicht nötig.
Es ist nicht nur nicht nötig, sondern es ist sogar schlichtweg falsch
-
hustbaer schrieb:
Das "kann eigentlich nicht sein".
Korrekt ist definitiv die Variante mit "\".Hallo und danke für die Antwort...
zum Thema "kann eigentlich nicht sein" habe ich ein kurzes Video gemacht, weil ich nicht weiß wie ich es sonst zeigen soll:
http://screencast.com/t/lVxGkL7h
Gruß
**
EDIT:**
um die Verwirrung um die Backslashes zu kompletieren, ist mir noch etwas hier im forum aufgefallen: ich mache mal zwei screenshots:http://screencast.com/t/jL325x8v6
http://screencast.com/t/rb4SzERo9Ww
EDIT2:
vielleicht sollte ich mal paar daten dazugeben:
OS: Windows7 professional 64bit
ich verwende codeblocks 10.05 als compiler
und firefox 7.0 als browser für das forum hier
die datei.dat wurde jedoch auf einem 32 bit Windows 2000 System erstellt.
die datei1.dat habe ich hier erstellt.
-
doppelt gepostet, sorry
hustbaer schrieb:
Das "kann eigentlich nicht sein".
Korrekt ist definitiv die Variante mit "\".Hallo und danke für die Antwort...
zum Thema "kann eigentlich nicht sein" habe ich ein kurzes Video gemacht, weil ich nicht weiß wie ich es sonst zeigen soll:
http://screencast.com/t/lVxGkL7h
Gruß
**
EDIT:**
um die Verwirrung um die Backslashes zu kompletieren, ist mir noch etwas hier im forum aufgefallen: ich mache mal zwei screenshots:http://screencast.com/t/jL325x8v6
http://screencast.com/t/rb4SzERo9Ww
EDIT2:
vielleicht sollte ich mal paar daten dazugeben:
OS: Windows7 professional 64bit
ich verwende codeblocks 10.05 als compiler
und firefox 7.0 als browser für das forum hier
die datei.dat wurde jedoch auf einem 32 bit Windows 2000 System erstellt.
die datei1.dat habe ich hier erstellt.
-
hustbaer schrieb:
Achja, nochwas:
theta schrieb:
BTW: das delete[] ist bei statisch allozierten Arrays nicht nötig.
Es ist nicht nur nicht nötig, sondern es ist sogar schlichtweg falsch
Mir fehlten die richtigen Worte.
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke fürs Verschieben.
ich habe die Frage in einem englisch sprachigen Beginners Forum auch gestellt, dort meint jetzt jemand:
After watching the video, I can only say that your Windows is broken. Or your C++ compiler, or your STL for that compiler. Try other compilers. Try Visual Studio.
zwei fragen:
kann er damit wirklich recht haben? wenn ja, wie teste ich das?und hat sich jemand die screenshots angeschaut, bin ich der einzige der im forum doppelbackslashes nicht sehen kann (zeigt nur einen an) aber in den vorschauen (also jetzt zum beispiel unten bei Themen-Überblick) dann doch?
-
ARGH
Ich sehe gerade, das Forum mag doppelte \ nicht - und frisst die bei der Darstellung. Sorry!Also: Korrekt ist definitiv die Variante mit
"\\"
. Also doppelt. Zwei Stück. Einer und noch einer
-
Achja...
Schreib mal die verschiedenen String-Varianten (mit einem und mit zwei Backslash) in die Konsole.
Dann weisst du zumindest was dein Compiler aus dem \d macht.
-
hustbaer schrieb:
ARGH
Ich sehe gerade, das Forum mag doppelte \ nicht - und frisst die bei der Darstellung. Sorry!puh und ich war wirklich am zweifeln ob mein windows broken ist, wie der in dem anderen forum meint.
danke! hätte ich nicht erwartet, das das in einem Forum in dem \ und\\
so wichtig sind der Fall ist.hustbaer schrieb:
Achja...
Schreib mal die verschiedenen String-Varianten (mit einem und mit zwei Backslash) in die Konsole.http://screencast.com/t/8yeAkOWQW90d
sieht für mich so aus, wie es erklärt wurde, wieso ich damit datei.dat finde ist mir immernoch ein rätsel.
ich habe inzwischen microsoft visual c++ 2010 express installiert, damit lässt sich datei.dat überhaupt nicht mehr öffnen wenn diese auf S: liegt... in einem unterverzeichnis geht es dann mit zwei backslash. datei2.dat geht auch direkt auf S: mit MSVC++2010Express (allerdings mit 2 backslashes)
als Anfänger verunsichert mich das jetzt schon ziemlich, wenn ich nichtmal sicher eine datei öffnen kann, die defnitiv da ist. denn mein erstes projekt sollte eigentlich ein datei interpreter bzw konverter werden
EDIT:
Gerade hat es bei mir klick gemacht! Der Fehler / das Phenomen kam daher das es im projektverzeichnis eine kopie von datei.dat aber keine von datei2.dat gab, also hat S:\datei.dat nicht die datei auf s sondern die im projektordner geöffnet. codeblocks scheint in dem Fall das S: zu ignorieren im gegensatz zu microsoft. Es ist also alles gut und ich kann mein Projekt doch in Angriff nehmen!
danke für die Hilfen - ich komme bestimmt wieder
-
nelphin schrieb:
EDIT:
Gerade hat es bei mir klick gemacht! Der Fehler / das Phenomen kam daher das es im projektverzeichnis eine kopie von datei.dat aber keine von datei2.dat gab, also hat S:\datei.dat nicht die datei auf s sondern die im projektordner geöffnet. codeblocks scheint in dem Fall das S: zu ignorieren im gegensatz zu microsoft. Es ist also alles gut und ich kann mein Projekt doch in Angriff nehmen!
danke für die Hilfen - ich komme bestimmt wieder
Nene. Codeblocks ignoriert das "S:" nicht.
Codeblocks ignoriert nur den einfachen "\" wenn danach ein "d" kommt, der Pfad wird zu "S:datei.dat".
Da greift dann eine Eigenheit von Windows, nämlich dass jedes Laufwerk sein eigenes "current directory" hat. Und dieses spricht man genau mit so einem Pfad an, also ohne Backslash nach dem ":".