Schreiben Sie eine Neue Zeile in eine Datei
Ich bin derzeit mit Hilfe der folgenden Befehle zu schreiben, um eine Ausgabe-Datei für mein Programm. Ich möchte strings, gespeichert in einem 2D-array und schreibt Sie in eine Ausgabedatei, die ich habe, die ist "url_storage.txt".
Beispiel unten zeigt, wie ich die Datei in der Nähe der start des Programms (D. H. die erste Datei-Deskriptor-Deklaration und dem Aufruf von open(...)) und zeigt die primären Aufruf zu schreiben(...), die Auftritt, in einer while-Schleife (schreiben von jedem Schlitz in dem 2D-array oder collection von strings/Zeichen-arrays). Mein Problem ist, dass ich einfügen wollen, um ein NEWLINE-Zeichen nach jeder Zeichenfolge, aber der folgende code führt nicht eine Datei, in der jede Zeichenfolge (oder das Ergebnis von jedem schreiben) auf einer separaten Zeile. Gibt es eine einfache Möglichkeit für die write-Funktion zu erkennen, dass ich es will um sich an die neue-Zeile-Zeichen? Ich fand auch, dass es eine Funktion lseek (...), welche die Lautstärke meiner Datei position pointer (wie es aussieht ist es nicht wirklich nützlich für die neue Linie Anpassungen). Irgendwelche Vorschläge auf, wie man, um auf die nächste Zeile?
int fd2 = open("/directory/path/to/target/output/file/url_storage.txt", O_WRONLY, O_CREAT, 00777);
...
while(...){
...
(void) write(fd2, (" %s \n", matches[ind]), strlen(matches[ind]));
}
InformationsquelleAutor 9codeMan9 | 2013-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
:
nicht tun, was Sie denken, es tut. Du bist verwirrend
printf()
mitwrite()
. Dem 'format-string'" %s \n"
ist der erste Teil einer Komma-Ausdruck und effektiv weggeworfen. Die saite allein in die Datei geschrieben. Sie müssen schreiben Sie den Zeilenumbruch getrennt:Oder verwenden Sie POSIX -
dprintf()
, die ähnlichfprintf()
aber schreibt in eine Datei-Deskriptor statt einen Datei-stream.Ich habe versucht zu Folgen, was zu sein scheint, Ihre Absicht, ein Leerzeichen vor und nach dem string, aber es waren meine code das Leerzeichen zumindest würde entfallen (keine Notwendigkeit für ein Leerzeichen vor einem Zeilenumbruch in fast allen Umständen — außer nach der
--
wird, markiert den Beginn einer Signatur in der E-Mail. Die vorhergehenden Raum möglicherweise erforderlich, trennen Sie die Zeichenfolge von dem, was ging vor. Allerdings würde ich wahrscheinlich schreiben:Oder das äquivalent mit separaten
write()
Anrufe.Übrigens, Sie schrieb das äquivalent von:
Komplizierte historische Gründe, der Prototyp der
open()
istint open(const char *path, int flag, ...);
aber nur 2 oder 3 Argumente gültig sind und die Sie verwendet haben, 4. Sie sollten geschrieben haben:aber der compiler kann nicht ohne weiteres diagnostizieren den Fehler, schließlich ist der Prototyp sagt: 'eine beliebige Anzahl von Argumenten'. Auch, es sei denn Sie schreiben ein shell-Skript, sollte die Datei nicht ausführbar sein (so 0666 statt 0777), und ich würde bereit sein, zu argumentieren, dass es nicht öffentlich schreibbar, so 0664 oder sogar 0644 besser wäre, ungeachtet der Verfügbarkeit eines
umask
Wert. Übrigens ein Vorteil der Verwendung einer Variablen wiepath
statt eines Literals ist, dass es einfacher ist zu berichten, aussagekräftige Fehlermeldungen mit dem Datei-Namen, wenn Sie nicht haben, zu wiederholen, das string-literal.dprintf(fd2, (" %s \r\n", matches[ind]));
(es sah, es schien sehr viel wie eine normale drucken-Funktion einfach mit einem Datei-Deskriptor, als seine 1. argument) ich bekam die gleichen Ergebnisse, keine neuen Zeilen. Irgendwelche Vorschläge? Meine Letzte option, versuchen, eine follow-up-call zu schreiben, und schreiben Sie in das newline-Zeichen \n und sehen, was passiert.Sind Sie auf einem Windows-Computer oder einer Unix-Maschine? Auf Windows, die
printf()
Familie normalerweise befasst sich mit Zeilenenden für Sie, sicherzustellen, das Ende ist\r\n
obwohl Sie gerade verwenden\n
im code. Diewrite()
Funktionen kategorisch nicht tun mapping. Ich denke, dassdprintf()
fällt enger mitprintf()
alswrite()
. Also, versuchen Sie, ein\r
auf den Ausgang, da die andere person die Beantwortung vorgeschlagen.Okay, also habe ich beschlossen zu gehen mit Ihrem Ansatz und einfach nur das weglassen der Leerzeichen (ursprünglich waren Sie da, nur um zu sehen, ob ich bekommen konnte, jede Art von Abstand zwischen den URL-Zeichenfolgen--das war nicht passiert). Das funktioniert und gibt mir jeden string in einer neuen Zeile, plus, wie ich den Aufruf zu schreiben, begraben innerhalb der if-Anweisung überprüft, ob die Funktion geklappt. Ich bin auf einem Windows-Rechner (unter Verwendung der Cygwin-Umgebung), aber die haben schon sftp-ing/Remote-Zugriff auf einen Linux-account. Während ich den code schreiben, der auf meinem Windows-Computer verwende ich die Kommandozeile auf dem Linux-Fernbedienung, um kompilieren und den code auszuführen.
Getestet habe ich sowohl newline-Zeichen Ansätze innerhalb der format-string zu dprintf(...) übrigens: die beiden '\n' und "\r\n' work. Ich denke, gehen mit der letzteren wird sicherer, und die Arbeit an Linux-und Windows-Umgebungen?
Es sei denn du hast einen starken Grund für eine andere Vorgehensweise vorliegt, schlage ich vor, mit
fopen()
undfprintf()
; es wird einfacher für Sie, denke ich. Wagenrücklauf (\r
) auf Unix (Linux) sind so etwas wie ein ärgernis; Sie funktionieren, aber sind nicht erwünscht. Stellen Sie sicher, dass Siefopen()
die Datei im text-Modus (nicht im Binär-Modus, also kein "b" im mode-string) und\n
in der Quelle sollte korrekt funktioniert für Linux wenn auf Linux laufen und sollten ordnungsgemäß für Windows wenn Sie unter Windows laufen.InformationsquelleAutor Jonathan Leffler