Ich habe ein kleines Problem beim Experimentieren mit C-Code. Ich habe versucht, mit read() - Command einen Text aus einer Datei zu lesen und die Ergebnisse in einem charArray zu speichern. Aber wenn ich die Ergebnisse drucke, unterscheiden sie sich immer von der Datei. HierC UNIX - read() liest keine existierenden Buchstaben
ist der Code:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void main() {
int fd = open("file", 2);
char buf[2];
printf("Read elements: %ld\n", read(fd, buf, 2));
printf("%s\n", buf);
close(fd);
}
Die Datei "Datei" wurde im gleichen Verzeichnis mit dem folgende UNIX erstellt Befehle:
cat > file
Hi
So enthält es nur das Wort "Hallo". Wenn ich es ausführe, erwarte ich, dass es 2 Bytes aus der Datei liest (die "H" und "I" sind) und sie bei buf [0] und buf [1] speichern. Aber wenn ich das Ergebnis drucken möchte, scheint es, dass es ein Problem gab, weil neben dem Wort "Hi" mehrere seltsame Zeichen gedruckt sind (was auf ein Speicherlese-/Schreibproblem hindeutet, das ich aufgrund der schlechten Puffergröße vermute). Ich habe versucht, die Größe des Buf-Array zu erhöhen, und es scheint, dass, wenn ich die Größe ändere, die seltsamen Zeichen sich ändern. Das Problem wird entfernt, wenn die Größe 32 Byte erreicht.
Kann mir jemand im Detail erklären, warum das passiert? Ich habe bis jetzt verstanden, dass read() nicht '0' liest, wenn es etwas liest, und dass der dritte Parameter von read() die maximale Anzahl der zu lesenden Bytes angibt.
Antoher Sache, die ich beim Experimentieren mit dem obigen Code festgestellt habe, ist Folgendes: Nehmen wir an, man ändert den dritten Parameter (maximal zu lesende Bytes) von read() zu 3 und die Größe von buf-Array zu 512 (Overkill ich weiß, aber ich wollte wirklich sehen, was passieren wird). Jetzt liest man ein drittes Zeichen (in meinem Fall 'e') und speichert es in den Puffer, auch wenn dieses dritte Zeichen nicht existiert.
Ich habe schon eine Weile gesucht @StackOverflow und ich fand viele ähnliche Fälle, aber keine von ihnen hat mich mein Problem verstehen lassen. Wenn es einen anderen Thread gibt, den ich vermisst habe, wäre es eine Freude, wenn du mich damit verlinken könntest.
Endlich: sry für mein schlechtes Englisch, es ist nicht meine Muttersprache.
'char buf [3];' lesen dann null terminieren 'buf [2] = '\ 0';' das wird es tun. –
Mögliches Duplikat von [Einfachster Weg, den Inhalt der Datei in C zu erhalten] (https://stackoverflow.com/questions/174531/easiest-way-to-get-files-contents-in-c) –
'printf ("%. * s \ n ", (int) n, buf);', wobei 'n' die Zahl ist, die du von' read' zurückbekommen hast. –