1. Textdateien
Erinnere dich: Ein Computer speichert alles, wirklich alles, als Einsen und Nullen (oder, wenn du das Wort nicht fürchtest – als eine Folge von Bytes). Aber wenn du zwei Programmen dieselbe Datei gibst, heißt das noch lange nicht, dass sie gleich damit umgehen. Zum Beispiel sieht das eine Programm darin normalen Text, das andere nur einen Haufen "kaputter Bytes". Das liegt alles am Dateiformat – also daran, wie genau diese Bytes interpretiert werden. Das Format beschreibt die innere Datenstruktur, die Leseregeln und die Kodierung. Ohne das Wissen über das Format kann ein Programm einfach nicht verstehen, was in der Datei gespeichert ist.
Eine Textdatei ist eine Datei, in der die Daten als normaler Text in irgendeiner Kodierung vorliegen (meistens UTF-8 oder, wenn’s ganz oldschool sein soll, ASCII). Den Inhalt so einer Datei kannst du in jedem Texteditor öffnen (zum Beispiel in Notepad oder VS Code) und sofort lesen – das sind Zeichenketten, keine mysteriösen Steuerbytes oder Binärstrukturen.
Typische Beispiele
- *.txt – normale Textdateien, zum Beispiel "to-do.txt" oder "best-books.txt".
- *.csv – Dateien, in denen Daten durch Kommas oder Semikolons getrennt sind (praktisch für Tabellen).
- *.json – Dateien für den Austausch von strukturierten Daten (zum Beispiel Buchlisten).
- *.xml,*.html – zum Speichern und Übertragen von strukturierten Daten.
Beispiel einer CSV-Datei
Dune;Frank Herbert;1965
1984;George Orwell;1949
Meister und Margarita;Mikhail Bulgakov;1966
Jede Zeile ist ein eigener Eintrag (zum Beispiel ein Buch). Die Werte in der Zeile sind durch Semikolon getrennt, was die Datei zu einem CSV (Comma-Separated Values) macht. Comma ist eigentlich das Komma, aber hier wurde es durch ein anderes Trennzeichen (;) ersetzt. Die Zeichen, die du siehst, sind genau die Bytes, die auch das Programm liest – vorausgesetzt, es weiß, wie es das Textformat und die Kodierung interpretieren muss.
Wie arbeitet ein Programm mit einer Textdatei?
Einfach die Datei "als Text" öffnen und zeilenweise lesen. Beispiel (das wirst du in späteren Vorlesungen brauchen):
// Einfaches Lesen von Zeilen aus einer Datei (Details kommen noch)
string[] zeilen = File.ReadAllLines("books.txt");
foreach (string zeile in zeilen)
{
Console.WriteLine(zeile);
}
Vorteile von Textdateien
- Vom Menschen lesbar (human-readable).
- Leicht von Hand zu bearbeiten (sogar im einfachsten Programm wie Notepad).
- Super zum Debuggen und für den Austausch zwischen verschiedenen Systemen.
- Einfach zwischen verschiedenen Plattformen zu übertragen (Windows, Linux, Mac).
Nachteile von Textdateien
- Keine strenge Struktur (txt), Formatierungsfehler schleichen sich leicht ein.
- Brauchen mehr Speicherplatz (zum Beispiel die Zahl 12345 = 5 Bytes, binär wären es 4).
- Komplexe Daten (z.B. Bilder, Audio) lassen sich als Text schwer oder gar nicht übertragen.
- Performance: langsamer bei großen Datenmengen.
Gut zu wissen
- Verschiedene Plattformen verstehen "Zeilenende" unterschiedlich: Windows – \r\n, Unix – \n.
- Kodierungen können unterschiedlich sein (UTF-8, UTF-16, ANSI usw.), das heißt, eine Datei, die auf einem System geschrieben wurde, kann auf einem anderen als "chinesische Zeichen" erscheinen (eigentlich ist das nur eine falsche Interpretation der Bytes).
2. Binärdateien
Eine Binärdatei ist eine Datei, in der keine Zeichen, sondern beliebige Bytes gespeichert sind. Sie können alles bedeuten: Zahlen, Strukturen, Bilder, Musik, sogar Maschinencode. Versuch mal, eine .exe in Notepad zu öffnen – du siehst nur Kauderwelsch!
Typische Beispiele
- *.exe, *.dll – ausführbare Dateien und Bibliotheken.
- *.jpg, *.png, *.gif– Bilder.
- *.mp3, *.wav– Audiodateien.
- *.dat – Dateien mit beliebigen Benutzerdaten.
- Spezielle Anwendungsformate (*.docx, *.xlsx usw.) – fast immer binär.
Wie ist eine Binärdatei aufgebaut?
Byte für Byte schreibt und liest das Programm die Daten im gewünschten Format. Zum Beispiel wird eine Zahl vom Typ int als 4 Bytes (32 Bit) gespeichert, und ein String ist meistens: Länge + die Bytes der Zeichen in einer bestimmten Kodierung.
In einer Textdatei ist die Zahl 12345 die Bytes, die den Zeichen '1', '2', '3', '4', '5' entsprechen:
| Zeichen | UTF-8-Code |
|---|---|
| 1 | 49 |
| 2 | 50 |
| 3 | 51 |
| 4 | 52 |
| 5 | 53 |
In einer Binärdatei ist int 12345 (kleine Byte-Reihenfolge, little-endian) so:
| Position | Byte (hex) | Wert |
|---|---|---|
| 0 | 0x39 | 57 |
| 1 | 0x30 | 48 |
| 2 | 0x00 | 0 |
| 3 | 0x00 | 0 |
(Mit anderen Worten: 12345 = 0x00003039.)
Probier mal, dieselbe Zahl als Text und als Binär zu speichern – und vergleiche die Dateigröße. Die Binärdatei ist etwas kompakter.
Wie arbeitet ein Programm mit einer Binärdatei?
Spezielle Streams (zum Beispiel BinaryReader, BinaryWriter). Im Gegensatz zur Textdatei musst du die Struktur ganz genau kennen, sonst kannst du die Daten nicht lesen.
// Beispiel: Zahlen in eine Binärdatei schreiben
var writer = new BinaryWriter(File.Open("books.bin", FileMode.Create));
// Angenommen, wir schreiben: Anzahl Zeichen (int), dann die Bytes
string titel = "Dune";
writer.Write(titel.Length); // Länge (int) schreiben
writer.Write(titel); // String schreiben (wird in UTF-8 gespeichert)
writer.Write(1965); // Jahr schreiben (int)
writer.Close(); // Stream schließen
Das ist nur ein Beispiel. Mehr zur Arbeit mit Binärdateien gibt’s in den nächsten Vorlesungen.
Vorteile von Binärdateien
- Kompakt: brauchen weniger Speicherplatz.
- Schneller zu lesen und zu schreiben (besonders bei großen Datenmengen).
- Du kannst komplexe Strukturen speichern: Arrays, verschachtelte Objekte usw.
Nachteile von Binärdateien
- Nicht vom Menschen lesbar (human-unreadable).
- Wenn sich die Struktur der Datei ändert, können alte Daten verloren gehen oder "kaputt" sein.
- Du brauchst immer genaue Anweisungen, um den Inhalt zu parsen.
3. Welches Format wählen?
Text- vs. Binärdateien
| Kriterium | Textdatei | Binärdatei |
|---|---|---|
| Vom Menschen lesbar | Ja | Nein |
| Größe | Größer | Kleiner |
| Universalität | Hoch (jeder Editor) | Nur spezielle Programme |
| Geschwindigkeit | Langsamer | Schneller |
| Strenge des Formats | Nein | Ja, muss eingehalten werden |
| Strukturen speichern | Schwierig | Einfach |
| Risiko von Datenverlust | Niedrig (leicht zu bearbeiten) | Hoch (kleinster Fehler – Datei unlesbar) |
Auswahlkriterien
- Müssen die Daten vom Menschen lesbar, leicht änderbar und debugbar sein? – Nutze eine Textdatei (z.B. .txt, .csv, .json).
- Sind die Daten komplex, kommt es auf Größe und Geschwindigkeit an? – Binärformat.
- Müssen Daten zwischen verschiedenen Plattformen ausgetauscht werden? – Text ist besser, aber die Kodierung sollte Standard sein (UTF-8).
- Soll die Anwendung viele Daten lesen und schreiben, und das Format ist streng? – Wähle Binär.
In unserer Konsolenanwendung „Bücherliste“ ist für den Anfang das Textformat (.csv oder .txt) ideal. Später, wenn die Struktur komplexer wird oder wir die Ladegeschwindigkeit erhöhen wollen, können wir Binärdateien ausprobieren oder auf JSON/XML umsteigen.
4. Nützliche Details
Wo begegnen dir Text- und Binärdateien im Alltag?
Textdateien:
- Programmeinstellungen (oft in .ini oder .json).
- Skripte, Logs, Notizen.
- Import-/Exportdateien (Daten für den Austausch zwischen Anwendungen).
Binärdateien:
- Programme, Spiele, Bibliotheken (da schaut niemand einfach so rein).
- Große Datenbanken und Archive (z.B. .mdb, .zip).
- Medien: Musik, Fotos, Videos.
Ganze Datei auf einmal lesen (Textdarstellung):
string gesamterText = File.ReadAllText("books.txt");
// Jetzt ist gesamterText ein riesiger String mit dem ganzen Inhalt
Zeilenweise (optimal für Listen):
string[] zeilen = File.ReadAllLines("books.txt");
foreach (string zeile in zeilen)
{
// Du kannst die Zeile in Teile splitten
string[] teile = zeile.Split(';');
// teile[0] – Titel, teile[1] – Autor, teile[2] – Jahr
}
Binäres Lesen – strikt nach Struktur
var reader = new BinaryReader(File.Open("books.bin", FileMode.Open));
int anzahl = reader.ReadInt32(); // Wie viele Bücher
for (int i = 0; i < anzahl; i++)
{
string titel = reader.ReadString();
string autor = reader.ReadString();
int jahr = reader.ReadInt32();
// Jetzt kannst du den Eintrag wiederherstellen!
}
reader.Close();
5. Praktisches Beispiel: Wir erstellen eine Datei mit Büchern
Daten in eine Textdatei speichern
Wir speichern jedes Buch in einer Zeile im Format:
titel;autor;jahr der ersten Ausgabe
// Liste der Bücher, die wir speichern wollen
var buecher = new List<(string Titel, string Autor, int Jahr)>
{
("Dune", "Frank Herbert", 1965),
("1984", "George Orwell", 1949),
("Meister und Margarita", "Mikhail Bulgakov", 1966)
};
// In Textdatei speichern
var writer = new StreamWriter("books.txt");
foreach (var buch in buecher)
writer.WriteLine($"{buch.Titel};{buch.Autor};{buch.Jahr}");
writer.Close();
Du kannst books.txt in Notepad öffnen und alle Daten sehen.
Daten in einer Binärdatei speichern
Jetzt probieren wir das Gleiche, aber kompakter (wenn auch für Menschen unlesbar):
var writer = new BinaryWriter(File.Open("books.bin", FileMode.Create));
writer.Write(buecher.Count); // Anzahl der Bücher schreiben
foreach (var buch in buecher)
{
writer.Write(buch.Titel); // String – gespeichert als: Länge + Bytes
writer.Write(buch.Autor); // String
writer.Write(buch.Jahr); // Jahr (int)
}
writer.Close();
Wenn du versuchst, books.bin in einem Texteditor zu öffnen, siehst du nur Chaos: eine Menge unlesbarer Zeichen. Das ist normal. Binärdateien sind nicht für Menschen gedacht – sie können nur von Programmen korrekt verarbeitet werden, die genau wissen, wie diese Datei geschrieben wurde.
6. Typische Fehler beim Umgang mit Formaten
Wenn du versuchst, eine Binärdatei als Text zu lesen, bekommst du "Buchstabensalat" oder sogar einen Fehler. Genauso, wenn du eine Textdatei als Binär öffnest und eine strenge Struktur erwartest – gibt’s Probleme.
Der häufigste Fehler: Die Datenstruktur und die Reihenfolge beim Lesen/Schreiben stimmen nicht überein. Zum Beispiel hast du zuerst das Jahr, dann den Titel geschrieben, liest aber in umgekehrter Reihenfolge – dann bekommst du falsche Infos. Halte immer dieselbe Reihenfolge ein!
Sehr oft "schauen" Programmierer in die Textdatei, um die Speicher- und Ladelogik zu prüfen – genau dafür sind Textformate am Anfang praktisch. Binär ist eher für fortgeschrittene Szenarien oder wenn du die Speicher-Details vor dem User verstecken willst.
GO TO FULL VERSION