Sono un principiante in C e programmazione di sistema. Per un compito a casa, ho bisogno di scrivere un programma che legge l'input dallo stdin che analizza le linee in parole e che invia parole ai sottoprocessi di ordinamento usando le code di messaggi System V (ad esempio, count words). Mi sono bloccato alla parte di input. Sto cercando di elaborare l'input, rimuovere i caratteri non alfa, inserire tutte le parole alfa in minuscolo e infine dividere una riga di parole in più parole. Finora posso stampare tutte le parole alfa in minuscolo, ma ci sono delle linee tra le parole, che credo non siano corrette. Qualcuno può dare un'occhiata e darmi qualche suggerimento?Lettura da un file di testo e analisi delle parole in C
esempio da un file di testo: Il Progetto Gutenberg EBook di L'Iliade di Omero, da Omero
penso che l'uscita corretta dovrebbe essere:
the
project
gutenberg
ebook
of
the
iliad
of
homer
by
homer
Ma la mia uscita è la seguente:
project
gutenberg
ebook
of
the
iliad
of
homer
<------There is a line there
by
homer
Penso che la linea vuota sia causata dallo spazio tra "," e "da". Ho provato cose come "if isspace (c) quindi non fare nulla", ma non funziona. Il mio codice è sotto Qualsiasi aiuto o suggerimento è apprezzato.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
//Main Function
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
while ((c =fgetc(input_file)) != EOF)
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
c = tolower(c);
putchar(c);
}
else if (isspace(c))
{
; //do nothing
}
else
{
c = '\n';
putchar(c);
}
}
}
fclose(input_file);
printf("\n");
return 0;
}
EDIT **
Ho modificato il mio codice e finalmente l'uscita corretta:
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
int found_word = 0;
while ((c =fgetc(input_file)) != EOF)
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
found_word = 1;
c = tolower(c);
putchar(c);
}
else {
if (found_word) {
putchar('\n');
found_word=0;
}
}
}
}
fclose(input_file);
printf("\n");
return 0;
}
+1 per la pubblicazione di codice ragionevole. Un suggerimento: 'perror (input)'. Ci sono poche cose peggiori di un messaggio di errore senza un nome di file. –
funzione strtok forse utile. – keety