So Lesen Sie eine Datei, bis ein Zeichen in C
So habe ich diese input-Datei:
1 2 3 4 5 6 7
3 2 4 1 6 5 7
***
1 1 2
1 1 2
***end of input***
Ich Scannen möchte, die ersten zwei Zeilen von zahlen, die dann etwas mit Ihnen, dann überspringen Sie die *
und Scannen Sie die nächsten Zeilen von zahlen, und etwas mit Ihnen zu tun, als auch (wie eine Schleife, bis es liest *
).
Wie konnte ich das tun? Hier ist mein code:
int main(){
int i = 0, j ;
int temp[100];
char c, buf[20];
FILE *fp;
fp = fopen("input.txt", "r");
if (fp != NULL){
while (1 == fscanf(fp, "%d ", &temp[i])){
i++;
}
//do something with the integers
}
else{
printf("Cannot open File!\n");
}
return 0;
}
Also das problem ist, ich kann nur scan-die ersten zwei Linien der zahlen. Ich will scan die ganzen zahlen nach der *
als gut.
- was ist das Letzte Zeichen?
- Was ist genau das problem Auftritt?
- Es klingt wie Sie brauchen, um (a) fügen Sie den code nach dem 'etwas tun' - Zeile auf Zeilen mit Sternen (wie Lesen es mit
fgets()
), und dann wickeln Sie eine weitere Schleife um diewhile
, die "etwas tun" und "munch ' stars' code zu wiederholen, bis ein EOF-Zeichen. Im Idealfall sollten Sie die Datei schließen, nachdem Sie begegnet EOF. Es ist wahrscheinlich auch sinnvoll, entfernen Sie das Leerzeichen nach dem%d
im format-string — die Gründe sind vielschichtig, aber nachfolgende Leerzeichen gibt böse Verhalten, um interaktive Programme im besonderen. - Das problem ist, ich kann nur scan-die ersten zwei Linien der zahlen. Ich will scan die nächsten ganzen zahlen nach dem * wie gut. @JonathanLeffler Könnte mir helfen, und bieten einen code für, die? Für eine while-Schleife
- Was hindert Sie, das hinzufügen einer äußeren while-Schleife rund um Ihren aktuellen while-Schleife und "etwas tun" - code, wiederholen Sie den Vorgang? "Könnte mir helfen, und bieten einen code für das?" - Das ist wirklich nicht das, was SO geht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht könnten Sie so etwas tun (muss ctype.h):
Ich bin nicht ziemlich sicher, was dein problem ist. Vielleicht hilft Sie ein bisschen.
Bearbeiten: Sie können auch überprüfen jedes Zeichen, wenn es ein '*' mit einem einfachen if(-else) - Anweisung.
Kommentar:
Gliederung:
Ich nicht oft verwenden
do
...while
Schleife, aber es funktioniert hier, weil der Körper die innere Schleife nicht alles tun, dumm (wie angenommen es wurde eine gültige Eingabe, wenn es nicht war). Der code funktioniert ordnungsgemäß, wenn es mehrere aufeinanderfolgende Zeilen von Sternen, nichts zu tun zwischen Ihnen (weili
null jedes mal).Beachten Sie, dass ich nicht
fgets()
zu Lesen, die Linie der stars, aber es wäre möglich, dies zu tun:Beispielcode
Je nachdem, welche der beiden beschriebenen Lösungen verwendet wird, der code funktioniert auf die sample-Daten auf die gleiche Weise:
- Ausgang
;
ist ausreichend in den Körper der Schleife. Das Semikolon in einer Zeile auf seine eigene zu betonen, dass es eine leere Anweisung; einschließlich der Semikolon auf derselben Linie wie diewhile
wäre legitim, aber leicht zu übersehen. Könnte Sie Kleid das Semikolon mit(void)0;
odercontinue;
, aber das Semikolon, das auf eine Linie auf seinen eigenen eingerückt entsprechend ist die herkömmliche Art den code zu schreiben.3 2 4 7 5 6 1 2 1 1
aus der input-Daten in der zitierten Frage (die beginnt mit1 2 3 4 5 6 7 3 2 4 1 6 5 7
). Wenn Sie möchten, aktualisieren Sie Ihre Frage mit dem alternativen Beispiel-input-Datei, die Sie haben, zusammen mit der Ausgabe, die Sie erwarten, dann kann ich sehen, warum mein Programm produziert, was es tut.Tun Sie gut, aber die einzige Sache ist, Sie sind nicht das Lesen der gesamten Datei. Dies können Sie erreichen, indem Sie eine einfache änderung wie....
getc()
ist einint
soc
sollte einint
. Mitgetc()
wie Sie, dass bedeutet, dass die erste Zahl wird übersprungen, und das ist keine gute Idee, denke ich.