2016-12-10 3 views
0

Ich frage mich, ob es möglich ist, die neuen Zeilen beim Lesen einer Datei zu ignorieren. Ich habe ein kleines Programm geschrieben, das die Zeichen aus einer Datei liest und formatiert, aber die neuen Zeilen im Dokument durcheinander bringen die Formatierung, ich am Ende mit doppelten Leerzeichen, wo ich nur einen einzigen Abstand haben möchte.Ignorieren von n beim Lesen aus einer Datei in C?

Ist es möglich, diese Funktion zu deaktivieren? Damit die einzigen neuen Zeilen, die mein Programm ausdruckt, die neuen Zeilen sind, die ich in die Druckfunktionen meines Programms einfüge?

+2

Zeigen Sie Ihre Arbeit bisher und jemand wird Ihnen eher helfen. – edtheprogrammerguy

+1

Sicher nicht mit den Standard-Input-Bibliotheken. Aber es ist ziemlich einfach, jeden gelesenen Block von Zeichen zu durchlaufen und die Zeilenumbrüche zu entfernen. Warum tust du das nicht? – Gene

+0

@Gene Ist getc nicht in der Standard-Input-Bibliothek? – nicomp

Antwort

3

C bietet nicht viel Komfort, Sie müssen sie alle selbst bereitstellen oder eine Bibliothek von Drittanbietern wie GLib verwenden. Wenn Sie neu in C sind, gewöhnen Sie sich daran. Sie arbeiten sehr nah an dem blanken Metall Silizium.

Im Allgemeinen lesen Sie eine Datei Zeile für Zeile mit fgets() oder meine Vorliebe POSIX getline(), und die endgültige Newline abstreifen, sich durch im letzten Index suchen und es mit einem Null zu ersetzen, wenn es ein Newline ist.

#include <string.h> 
#include <stdio.h> 

char *line = NULL; 
size_t line_capacity = 0; /* getline() will allocate line memory */ 

while(getline(&line, &line_capacity, fp) > 0) { 
    size_t last_idx = strlen(line) - 1; 

    if(line[last_idx] == '\n') { 
     line[last_idx] = '\0'; 
    } 

    /* No double newline */ 
    puts(line); 
} 

Sie können dies in eine kleine Funktion für die Bequemlichkeit setzen. In vielen Sprachen wird es als chomp bezeichnet.

#include <stdbool.h> 
#include <string.h> 

bool chomp(char *str) { 
    size_t len = strlen(str); 

    /* Empty string */ 
    if(len == 0) { 
     return false; 
    } 

    size_t last_idx = len - 1; 
    if(str[last_idx] == '\n') { 
     srt[last_idx] = '\0'; 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Es wird lehrreich für Sie fgets und getline selbst zu implementieren zu verstehen, wie das Lesen Zeilen aus einer Datei tatsächlich funktioniert.

+0

Hallo, danke für die ausführliche Antwort. Ich werde dir die beste Antwort geben und den Thread schließen. Ich habe einen Weg gefunden, zu tun, was ich wollte. Ich habe Folgendes verwendet, wenn sich jemand gefragt hat: if (Zeichen [i-1]! = '\ N') {printf ("\ n");} – Gaarsin

+0

Ich werde Ihren Ratschlag annehmen, und ich danke Ihnen dafür. Ich habe erst vor ein paar Wochen angefangen, Code zu schreiben und ich habe bisher nur C benutzt, also bin ich nicht sehr erfahren. – Gaarsin

+1

@Gaarsin Wenn Sie einen anderen Tipp nehmen können: Beginnen Sie mit einer moderneren Sprache, insbesondere einer, die Speicherverwaltung für Sie übernimmt und eine bessere String-Handhabung hat. Lernprogrammieren ist schwer genug: Variablen, Schleifen, Funktionen, Einrückung, Objekte, algorithmisches Denken ... ohne sich jedes Mal Gedanken über die Speicherverwaltung machen zu müssen, wenn Sie nur zwei Strings verketten wollen. – Schwern

Verwandte Themen