2017-11-20 3 views
0

Ich versuche ein Programm zu schreiben, das Textzeilen aus einer Eingabedatei liest, die Buchstaben in den Wörtern neu anordnet und sie dann in eine Ausgabedatei schreibt. Bisher habe ich dies:Wie kann ich mit meinem C-Programm mehr als eine Textzeile aus einer Datei lesen?

void processFile(FILE* ifp, FILE* ofp) { 
char line[1024]; 
char word[1024]; 
char* lineptr = line; 
char temp; 
printf("Begin file processing\n"); 
while (fgets(line, BIGLINE, ifp) != NULL){ 

    while(sscanf(lineptr,"%s",word) == true) 
    { 
     if (strlen(word) >= 4){ 
      temp = word[1]; 
      word[1] = word[2]; 
      word[2] = temp; 
     } 
     fputs(word,stdout); 
     fputs(word,ofp); 
     fputs(" ",stdout); 
     fputs(" ", ofp); 
     lineptr += strlen(word) + 1; 

    } 

}/*while*/ 
printf("End file processing\n");} /* processFile */ 

Im Moment ist die Ausgabedatei lautet:

<rpe><div calss="text_to_html">Project Gtuenberg The Avdentures of Sehrlock Hlomes, by Atrhur Cnoan Dyole 

Aber ich brauche es alle Zeilen in meinem Test-Datei zu lesen

<pre><div class="text_to_html">Project Gutenberg The Adventures of Sherlock Holmes, by Arthur Conan Doyle 

This eBook is for the use of anyone anywhere at no cost and with 
almost no restrictions whatsoever. You may copy it, give it away or 
re-use it under the terms of the Project Gutenberg License included 
with this eBook or online at <a href="http://www.gutenberg.net" 
class="_blanktarget">www.gutenberg.net</a> 
</div></pre> 

ich auch Ich muss sicherstellen, dass, wenn ich eine Textdatei als Eingabedatei verwende, sie alle Zeilen lesen würde, anstatt nur die erste. Wie kann ich das mit dem machen, was ich bereits habe?

+0

Beachten Sie, dass '% s' eine durch Leerzeichen getrennte Zeichenfolge liest. Ist es das was du willst? Haben Sie bei jedem Schritt gedruckt, was Sie bekommen? Warum nicht? Oder sind Sie mit einem Debugger durchgegangen, anstatt Druckanweisungen hinzuzufügen? Du hast den Charakterwechsel programmiert; War das was du beabsichtigst? –

+0

Ihr Hauptproblem besteht darin, dass Sie 'lineptr' innerhalb der' while (fgets (...)! = NULL) Schleife zurücksetzen müssen, bevor Sie die innere Schleife starten. Es ist weniger wahrscheinlich, dass Sie auf dieses Problem stoßen, wenn Sie alle Variablen so platzieren, dass sie den minimal möglichen Gültigkeitsbereich haben - also sollte "temp" innerhalb des "if" -Blocks definiert sein, während "word" und "lineptr" definiert sein sollten die äußeren und inneren Schleifen. Sie haben ein kleines Pech, dass die erste Zeile, die Sie bearbeiten, die längste Zeile ist. es bedeutet, dass "lineptr" auf ein Nullbyte zeigt. –

+0

@ JonathanLeffler Ich benutzte 'sscanf (lineptr,"% s ", Wort)', so dass es ein Wort nach dem anderen lesen würde. Ich konnte mir keinen anderen Weg vorstellen. Ich denke, ich muss eine weitere Schleife hinzufügen, so dass sie die gelesenen Zeilen erhöht. – Megan

Antwort

1

Wie ich in einem Kommentar bemerkte, ist Ihr Hauptproblem, dass Sie lineptr innerhalb der while (fgets(…) != NULL) Schleife zurücksetzen müssen, bevor Sie die innere Schleife starten. Es wäre weniger wahrscheinlich, dass Sie auf dieses Problem stoßen würden, wenn Sie alle Variablen so platzieren, dass sie den minimal möglichen Gültigkeitsbereich haben - also sollte temp innerhalb des if Blocks definiert werden, während word und lineptr zwischen den äußeren und inneren Schleifen definiert werden sollten. Sie haben ein kleines Pech, dass die erste Zeile, die Sie bearbeiten, die längste Zeile ist. Das bedeutet, dass lineptr auf ein Nullbyte zeigt.

Sie sollten sizeof(line) anstelle von BIGLINE im Anruf zu fgets() verwenden. Die Verwendung von true, wo die Zählung 1 ist, ist ebenfalls nicht geeignet (obwohl technisch nicht korrekt).

Diese Änderungen ergeben:

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

static void processFile(FILE *ifp, FILE *ofp) 
{ 
    char line[1024]; 
    printf("Begin file processing\n"); 
    while (fgets(line, sizeof(line), ifp) != NULL) 
    { 
     char word[1024]; 
     char *lineptr = line; 
     while (sscanf(lineptr, "%s", word) == 1) 
     { 
      if (strlen(word) >= 4) 
      { 
       char temp = word[1]; 
       word[1] = word[2]; 
       word[2] = temp; 
      } 
      fputs(word, stdout); 
      fputs(word, ofp); 
      fputs(" ", stdout); 
      fputs(" ", ofp); 
      lineptr += strlen(word) + 1; 
     } 
     putchar('\n'); 
    } 
    printf("End file processing\n"); 
} 

int main(void) 
{ 
    processFile(stdin, stderr); 
    return 0; 
} 

Wenn von rf79.c in rf79 und laufen mit Standardfehler zu /dev/null umgeleitet kompiliert, ich die Ausgabe erhalten:

$ ./rf79 < data 2>/dev/null 
Begin file processing 
<rpe><div calss="text_to_html">Project Gtuenberg The Avdentures of Sehrlock Hlomes, by Atrhur Cnoan Dyole 

Tihs eoBok is for the use of aynone aynwhere at no csot and wtih 
amlost no rsetrictions wahtsoever. You u may cpoy it, gvie it aawy or 
r-euse it udner the trems of the Porject Gtuenberg Lciense icnluded 
wtih tihs eoBok or olnine at <a herf="http://www.gutenberg.net" 
calss="_blanktarget">www.gutenberg.net</a> 
<d/iv></pre> 
End file processing 
$ 

Das sieht aus wie, was Sie wollen.

+0

Ah danke, das ist genau das, was ich wollte. Ich fand auch eine etwas weniger effiziente alternative Lösung, indem ich '\ n' nach jeder Zeile setzte und dann eine for-Schleife einfügte, die sie auf null stellte, etwa so:' int n; für (n = 0; n Megan

Verwandte Themen