Wie kann ich ein Programm schreiben, das vertauschen eines Zeichens in den input-Datei mit einem Zeichen auf der Kommandozeile angegeben?
Ich versuche ein Programm zu schreiben, zu tauschen, ein Zeichen, dass ich in der Befehlszeile angeben (ein Kommandozeilen-argument) mit einem Charakter in das input-text-Datei. Die erste Kommandozeilen-argument ist der Charakter, den ich ändern möchte, das zweite argument ist das Zeichen, das möchte ich ersetzen die alten Charakter mit, und das Dritte argument ist die Eingabedatei.
Wenn ich das mache, mein Programm generieren soll eine output-Datei mit dem Namen: "translation.txt". Ich weiß, dass das problem bei meinem Programm ist in der "wenn" - Aussagen/die fprintf-Anweisungen, aber ich bin mir nicht sicher, wie Sie dieses Problem zu beheben. Ich dachte an das Lesen jedes Zeichens in der Eingabe-Datei getrennt, und von dort wollte ich mit "wenn" - Anweisungen, um zu bestimmen, ob oder nicht zu ersetzen, der Charakter.
void replace_character(int arg_list, char *arguments[])
{
FILE *input, *output;
input = fopen(arguments[3], "r");
output = fopen("translation.txt", "w");
if (input == NULL)
{
perror("Error: file cannot be opened\n");
}
for (int i = 0; i != EOF; i++)
{
if (input[i] == arguments[1])
{
fprintf(output, "%c\n", arguments[2]);
}
else
{
fprintf(output, "%c\n", arguments[1]);
}
}
}
int main(int argc, char *argv[])
{
if (argc < 5)
{
perror("Error!\n");
}
replace_character(argc, argv);
}
- Dies sollte nicht kompilieren. Sie können eine Datei nicht indizieren Zeiger struct.
- Ja, das ist eines der Probleme, die ich habe. 🙁 Ich möchte das vergleichen, jeder Charakter auf meinen Befehl Linie argument, aber ich bin Probleme mit, wie das zu tun.
- Man weiß eigentlich nicht, wie zu Lesen, die Eingabe in C, tun Sie?
- Ich bin ziemlich neu bei der Arbeit mit Dateien und so, so weit, alles, was ich gelernt habe, ist das öffnen von Dateien zum Lesen/schreiben, drucken Fehlermeldungen, wenn Dateien geöffnet werden können, und einfache Dinge wie, dass. 🙁
- mmap, richtig? Scheint, wie die meisten einfach Weg.. wenn Sie es bekommen, um zu arbeiten 🙂 Es ist schwer.. aber wenn es funktioniert, es ist super einfach! man7.org/linux/man-pages/man2/mmap.2.html
- Ich Tue dies als eine übung für die Klasse und ich glaube nicht, dass wir verwenden können, mmap. 🙁 Aber, gibt es eine Möglichkeit, dies zu tun mit "fgets"? Oder gibt es eine Möglichkeit, Lesen jedes Zeichen einzeln??
for (int i = 0; i != EOF; i++)
- wie willst du das beenden dieser Schleife? EOF ist -1 auf meiner Maschine, es nie zu beenden.- Hmm...würde ich eine "while" - Schleife statt einer for-Schleife? Ich habe gehört, dass es häufiger "while" - Schleifen beim arbeiten mit Dateien. Aber wenn ich mit einer while-Schleife habe ich zum Lesen der input-Datei vor der ersten rechts?
- Nein, es kann eine while-Schleife ohne Probleme, z.B. so etwas wie
while ((c = fgetc(filehandle)) != EOF)
- liest ein Zeichen in einer Zeit, ich denke, es könnte in Ihrem Fall. - OK, nicht zu abfälligen, aber den Unix-Befehl "tr" wird genau das tun, was Sie wollen, es sei denn, Sie gehen lieber durch die Programmierung. Ein "Mann tr" für details.
- Ich denke, ich gehe lieber durch die übung, es ist übung für eine bevorstehende Prüfung. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, ich denke, das kann helfen:
Gegeben eine Eingabe angegeben wie das erste argument, um ein Zeichen zu ersetzen und dann ersetzen Sie es mit dem, was gespeichert ist in
replacement
. Versuchen Sie es und lassen Sie mich wissen, wenn es nicht funktioniert. Ich betreibe es so:./a.out l a input_trans.txt
Meine Datei hat nur der string " Hallo, Welt!'. Nach der Ausführung dieser es geändert auf " Heaao, Worad!'.
Lesen, auf ftell und fseek, denn Sie sind hier der Schlüssel für das, was Sie tun müssen.
EDIT: Vergaß hinzuzufügen, eine
fclose
- Anweisung schließt die Datei, Griff am Ende des Programms. Behoben!fprintf
schreibt er an die weiter - Zeichen, so müssen wir uns backtrack ein Zeichen zu ersetzen, das richtige. Es ist auchfgetpos
undfsetpos
für diese Art der Sache, aber ich bin nicht sehr vertraut mit Ihnen, AFAIK tun Sie das gleiche.return
ist wie soreturn;
und nur, wenn Sie brauchen, um beenden Sie die Funktion, die früher als erwartet (zum Beispiel haben Sie einen Fehler gefunden und es gibt keine Notwendigkeit, weiter zu gehen). In Ihrem Fall empfehle ich Ihnen, lassen Sie die Validierung Teilmain
und lege dann den rest in die leere Funktion. Auch, Sie meinte wohlreturn 0;
, nichtreturn '/0';
wie diese gibt einechar
und es ist auch nicht gültig ist (denken Sie an\0
dem abschließenden Charakter).else
.if
Teil funktioniert nur auf das Zeichen, das ersetzt werden soll (sorry das ich geantwortet, bevor ich sah Ihren Kommentar Bearbeiten).fgets
scheint besser geeignet für das Lesen von strings, nicht einzelne Zeichen, aber wieder Sie würde gehen, durch eine Schleife, Lesen Sie die Anzahl der Zeichen, die Sie benötigen (in deinem Fall 2) und stattstdin
verbringen Sie Ihren Datei-handle, das als das Dritte argument. Vielleicht so etwas wie sowhile(fgets(char_array, 2, file_handle) != EOF)
. Aber wie es sich liest ein char-array, es fügt ein null-Endzeichen auf den Zeiger, er gibt, so müssten Sie zu Streifen, und weisen eine einfachechar
variable. Mehr info hier - cplusplus.com/reference/cstdio/fgets