Schritt eine Minute zurück und lernen Sie die Alternativen, die Sie für die Eingabe haben in C. Sie haben zeichenorientierte Eingabefunktionen (getchar()
, fgetc()
, etc ..), die eine Datei aus einem Zeichen-at-a-time lesen . Sie haben dann zeilenorientierte Eingabefunktionen (zB fgets
und getline
), die Linien der Eingabe zu einer Zeit gelesen wird, und schließlich haben Sie blockorientierten Eingabefunktionen wie fread
und read
, dass Sie die gesamte lesen können Datei in einen einzelnen Speicherblock. (Es gibt einige andere Werkzeuge zum Kopieren und Speicherzugriff wie sendfile
und mmamp
, die ebenfalls verwendet werden können, aber wahrscheinlich nicht beabsichtigt. Die scanf
Familie von Funktionen, obwohl sie dort verwendet werden, sind nicht dazu gedacht, unterschiedliche Werte über mehrere zu lesen Linien.
Ihr grundlegender Ansatz sollte entweder zeichenorientierte Eingang oder leitungsorientierten eingegeben wird, eine Datei in ein Array zu lesen. Die einfachere oder die zwei wären wahrscheinlich Zeile-orientierte Eingabe, wo Sie eine ganze Zeile lesen würden und dann tokenize die Zeile in separate Wörter mit strtok
(oder mit einem Start- und Ende-Zeiger, um jede Zeile zu gehen, nachdem es ist Lese trennende Wörter).
Machen Sie einen Stich auf Ihre gewählte Methode und schreiben Sie zurück, wenn Sie nicht weiterkommen. Wir helfen gerne.
Ein kurzes Beispiel für die Verwendung von fgets
zum Lesen jeder Zeile gefolgt von strtok
, um jede Zeile in Wörter zu trennen, könnte etwas Ähnliches wie folgt sein. note: das Programm wird aus dem Dateinamen in der Befehlszeile angegeben gelesen (oder von stdin
standardmäßig, wenn kein Name angegeben wird)
#include <stdio.h>
#include <string.h>
enum {MAXC = 1000};
int main (int argc, char **argv) {
char buf[MAXC] = "";
char *delims = " \t\n.,:;"; /* word separators for strtok */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* always validate file is open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (fgets (buf, MAXC, stdin)) { /* read each line into buf */
char *p = buf;
printf ("\n line: %s\n tokens:\n", buf);
/* tokenize buf into words with strtok */
for (p = strtok (buf, delims); p; p = strtok (NULL, delims))
printf (" %s\n", p);
}
if (fp != stdin) fclose (fp); /* close if not reading stdin */
return 0;
}
Beispiel Eingabe
$ cat dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
Beispiel/Output
$ ./bin/strtok_fgets_file <dat/captnjack.txt
line: This is a tale
tokens:
This
is
a
tale
line: Of Captain Jack Sparrow
tokens:
Of
Captain
Jack
Sparrow
line: A Pirate So Brave
tokens:
A
Pirate
So
Brave
line: On the Seven Seas.
tokens:
On
the
Seven
Seas
warum versuchst du nicht fgets direc Sie haben bereits den für Sie vorgesehenen Platz zugewiesen, da fscanf bei der ersten Soave aufhört? – Kiloreux
Oder einfach nur die ganze Datei. Es scheint keinen Grund zu geben, irgendeine Token-Funktion zu verwenden. – Olaf
Ihre 'for' Schleife hat einen leeren Körper. Bitte entfernen Sie das Semikolon nach 'for (i = 0; i! = 100; i ++)' - auch 'i <100' wäre sicherer ... (-: – user3078414