2016-12-21 16 views
0

Ich habe ein Programm (Konsole), wo ich den ganzen Text in eine separate .txt-Datei.C: Wie füge ich einen Zeilenumbruch von einer Datei ein?

Ich benutze fgets() eine Zeichenfolge aus der Datei zu lesen, aber wenn die Datei ein \ n enthält und ich die Zeichenfolge später drucken, druckt es \ n anstelle eines Zeilenumbrüche

Hier ein Beispiel:

FILE* fic = NULL; 
char str[22]; //str is the string we will use 

//open the file 
fic = fopen ("text.txt", "r"); 

//read from the file 
fgets(str, size, fic); 

printf(str); 

Wenn das ist, was ich in meinem text.txt haben:

This is \n an example 

Doch was auf der Konsole kommt aus ist

This is \n an example 

Statt

This is 
an example 

Edit: in der Datei als \ n geschrieben. Ich habe auch versucht addint \ oder \ t in der Datei, aber es würde drucken \ und \ t anstelle einem tabellarischen oder ein einzelnen Backslash

+1

Gibt es 2 Zeichen ("\" und "n") oder 1 Zeichen ("\ n") in der Datei? – mch

+0

in der Datei geschrieben als \ n Ich probierte auch addint \\ oder \ t in der Datei, aber es würde \\ und \ t anstelle einer Tabellierung oder eines einzelnen Schrägstrichs – Speedphoenix

+0

'\ n'' ** drucken ** Der Zeilenumbruch/Zeilenumbruch. Ich sehe überhaupt kein Problem. ** Niemals ** eine Zeichenkette von externer Quelle als 'printf'-Formatzeichenfolge verwenden! Das ist eine der typischsten Sicherheitslücken in C. – Olaf

Antwort

3

fgets sieht nur die \ und die n als normale Zeichen. Sie müssen es selbst in ein Zeilenvorschubzeichen übersetzen. Vielleicht mit Hilfe von strstr() oder ähnlichem.

1

Das ist, weil Escape-Zeichen in String und Zeichenliterale durch die Compiler behandelt werden, wenn Es analysiert Ihren Code. Es ist nicht etwas, das in der Bibliothek oder dem Laufzeitcode für alle Zeichenfolgen vorhanden ist.

Wenn Sie z.B. die zwei Zeichen \n, die Sie aus einer Datei lesen, dann müssen Sie es in Ihrem Code selbst behandeln. Zum Beispiel, indem Sie die Zeichenfolge Zeichen für Zeichen durchlaufen und nach '\\' suchen, gefolgt von 'n'.

+0

@LeonardoJeanteur Also ist das einzelne Zeichen \ gefolgt von dem einzelnen Zeichen n? Das ist, was ich meine, die Laufzeitbibliothek oder jede vorhandene Standard-String-Funktion übersetzt es nicht in einen Newline. Sie müssen diese Übersetzung selbst machen. –

+0

Ich habe deine Antwort nicht gelesen. Ich habe meinen Kommentar gelöscht, danke für deine Antwort – Speedphoenix

0

Der Compiler scannt die Textdatei und speichert die Daten/Texte wie in str string. Der Compiler nimmt \n nicht als Escape-Sequenz. Wenn Sie also in die nächste Zeile wechseln möchten, wenn \n angezeigt wird, sollten Sie Zeichen für Zeichen scannen, und wenn \n angezeigt wird, sollten Sie printf("\n").

#include <stdio.h> 

int main(){ 
    char str[30]; 
    int i = 0; 
    FILE *fic = NULL; 
    fic = fopen("text.txt", "r"); 
    while(!feof(fic)){ 
     str[i++] = getc(fic); 
     if(i > 30){ //Exit the loop to avoid writing outside of the string 
      break; 
     } 
    } 
    str[i - 1] = '\0'; 
    fclose(fic); 

    for(i = 0; str[i] != '\0'; i++){ 
     if(str[i] == 'n' && str[i - 1] == '\\'){ 
      printf("\n"); 
      continue; 
     } 
     if(str[i] == '\\' && str[i + 1] == 'n'){ 
      printf("\n"); 
      continue; 
     } 
     printf("%c",str[i]); 
    } 
    return 0; 
} 
+0

Wenn das Dateiende angetroffen wird und 'gets()' '' EOF' zurückgibt, wird dieser Code 'EOF' zuweisen, um' str [i ++] 'als ob es ein Zeichen wäre . Nicht gut programmiert. Überprüfen Sie das Ergebnis von 'fgetc()' wie 'int ch = fgetc(); wenn (ch == EOF) bricht; str [i ++] = ch; '. BTW 'feof (fic)' wird hier nicht benötigt, da Probleme zu spät erkannt wurden. – chux

Verwandte Themen