Lesen Eingaben aus einer Datei und schreiben in eine andere Datei in den C
Ich versuche zu Lesen, den Inhalt von einer Datei "file.txt" und schreiben Sie jedes Zeichen von dort bis "copy.txt" aber ich bekomme seltsame Zeichen am Ende des "copy.txt" Datei.
Ich versuche zum öffnen und schließen der beiden Dateien, und ändern Sie die Körper der while-Schleife in das Programm so, dass der Charakter nicht mehr auf der standard-Ausgabe (stdout).
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c;
FILE *from, *to;
from = fopen("file.txt", "r");
if (from == NULL)
{
perror("file.txt doesn't exist.");
exit(1);
}
to = fopen("copy.txt", "w");
if (to == NULL)
{
perror("copy.txt doesn't exist.");
exit(1);
}
do
{
c = getc(from);
putc(c, to);
}
while(c != EOF);
fclose(to);
fclose(from);
exit(0);
}
Rufen Sie
Auch
Übrigens @JamesR, der Grund für die Verwendung
Sie können ändern Sie die Schleife, um
Bitte Einrücken von code konsistent. Schlage vor, Spiegelstrich 4 Leerzeichen nach jeder öffnenden Klammer '{' und un-Einzug vor jeder schließenden Klammer '}'. Verwenden Sie keine Tabulatoren für Einrückungen als jede Textverarbeitung/editor definiert den Tabulator/tab-breiten anders. Verwenden Sie 4 Räume, die sichtbar ist, auch mit variabler Breite Schriftarten.
putc()
mit der EOF
Ergebnis nach getc()
zurück EOF
.Auch
c
sollte ein int
, nicht ein char
.Übrigens @JamesR, der Grund für die Verwendung
int c
und nicht char c
ist, dass EOF
ist nicht unbedingt darstellbar in einer char
.Sie können ändern Sie die Schleife, um
while ((c = getc(from)) != EOF) { putc(c, to); }
.Bitte Einrücken von code konsistent. Schlage vor, Spiegelstrich 4 Leerzeichen nach jeder öffnenden Klammer '{' und un-Einzug vor jeder schließenden Klammer '}'. Verwenden Sie keine Tabulatoren für Einrückungen als jede Textverarbeitung/editor definiert den Tabulator/tab-breiten anders. Verwenden Sie 4 Räume, die sichtbar ist, auch mit variabler Breite Schriftarten.
InformationsquelleAutor JamesR | 2015-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Problem liegt in dieser Schleife:
Was Sie brauchen, um zu verstehen, ist der Unterschied zwischen einem
do-while
und einwhile
Schleife. Einwhile
- Schleife wird der Ausdruck ausgewertet, BEVOR die Ausführung der Schleife (und somit läuft die Schleife mindestens 0-mal) und einedo-while
- Schleife wertet NACH der Schleife Kreis (damit läuft zumindest eine Zeit).Also was ist das problem? Sie Lesen ein Zeichen, schreiben Sie es auf
copy.txt
DANN zu bewerten, wenn seineEOF
- und Ausfahrt der Schleife oder nicht. Nun, was passiert, wenn das Letzte Zeichen aus der Datei gelesen wird? Die Schleife wird ausgeführt man mehr Zeit, als das Letzte Zeichen ist NICHTEOF
. Ihr Programm liest ein oder mehrere Zeichen-und Schreibzugriff auf die Datei. Das ist das Zeichen, dass Sie gemeint ist.So, um zu beheben, müssen Sie auswerten, für
EOF
VOR dem schreiben. Hier sind zwei versuche, eine, die halten wird Ihredo-while
- Schleife und eine mit einemwhile
loop (klarer):Do-While-Versuch (nicht schön und unnötig, wenn):
Während Versuch:
if (c != EOF) { c = getc(from);
Danke, Krank zu korrigieren. 🙂
Wieso der downvote? Pls einen Kommentar hinterlassen, wenn alles in Ordnung ist!
InformationsquelleAutor Nidhoegger