Ora ho un altro problema: nella traduzione, se trovo un carattere non-alfanumerico, devo stampare un messaggio di errore(senza stampare la traduzione della riga corrente) e passare alla riga successiva del file.
File:
a:. -
b:- . . .
c:- . - .
d:- . .
e:.
f:. . - .
g:- - .
h:. . . .
i:. .
j:. - - -
k:- . -
l:. - . .
m:- -
n:- .
o:- - -
p:. - - .
q:- - . -
r:. - .
s:. . .
t:-
u:. . -
v:. . . -
w:. - -
x:- . . -
y:- . - -
z:- - . .
0:- - - - -
1:. - - - -
2:. . - - -
3:. . . - -
4:. . . . -
5:. . . . .
6:- . . . .
7:- - . . .
8:- - - . .
9:- - - - .
****
Hey man!
This is the text to be translated
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
#define DIM 36
#define DIM_COD 6
#define OFFSET_LETTERE 97
#define OFFSET_NUMERI 22
#define SPAZI_LETTERE 3
#define SPAZI_PAROLE 7
//Struttura che contiene un carattere alfanumerico e il relativo codice morse
typedef struct
{
//"Lettera" contiene le lettere da a-z e i numeri da 0-9
char simbolo;
char codifica[DIM_COD];
} Morse;
Morse alfabeto[DIM];
void inserimento(FILE *fPtr);
void stampa(FILE *fPtr);
void stampa_spazi(int num_spazi);
//void controllo_puntegaitura(FILE *fTempPtr, char pTemp);
int main(void)
{
FILE *fPtr;
if((fPtr = fopen("input.txt", "r")) != NULL)
{
inserimento(fPtr);
stampa(fPtr);
fclose(fPtr);
}
else
puts("Impossibile aprire il file.");
return 0;
}
//Riempe la struttura con i dati del file input.txt
void inserimento(FILE *fPtr)
{
char cod;
for(size_t i = 0; i < DIM; i++)
{
//Con il parametro "%c%*c" leggo il primo carattere alfanumrico e salto i due punti
if(fscanf(fPtr, "%c%*c", &(alfabeto[i].simbolo)) == 1)
{
unsigned short ind_cod = 0;
while(fscanf(fPtr, "%c", &cod) == 1 && cod != '\n')
{
if(cod != ' ')
{
alfabeto[i].codifica[ind_cod] = cod;
ind_cod++;
}
}
}
//---------------------------> le due printf sotto sono da eliminare
//printf("Simbolo: %c\n", alfabeto[i].simbolo);
//printf("Codifica: %s\nIndice: %ld\n", alfabeto[i].codifica, i);
}
}
//Stampa la traduzione
void stampa(FILE *fPtr)
{
char temp;
//Se la fscanf legge '*', allora mi trovo nel separatore “****”.
//Con il parametro "%c%*s%*c" mi posiziono nella linea successiva.
if(fscanf(fPtr, "%c%*s%*c", &temp) == 1 && temp == '*')
{
int inTemp = 0;
while(fscanf(fPtr, "%c", &temp) == 1)
{
temp = tolower(temp);
inTemp = (int)temp;
//printf("Temp: %c\nInt: %d\n", temp, inTemp);
if(temp != ' ' && temp != '\n')
{
if(inTemp >= 97 && inTemp <= 122)
{
printf("%s", alfabeto[inTemp-OFFSET_LETTERE].codifica);
stampa_spazi(SPAZI_LETTERE);
}
else if(inTemp >= 48 && inTemp <= 57)
{
printf("%s", alfabeto[inTemp-OFFSET_NUMERI].codifica);
stampa_spazi(SPAZI_LETTERE);
}
else
{
puts("\nErrore nell'input");
}
}
else if(temp == '\n')
puts(" ");
else
stampa_spazi(SPAZI_PAROLE);
}
puts(" ");
}
else
puts("Errore");
}
/*
//Controlla se nel file è presente un carattere non alfanumerico. Ritorna 0 se il carattere è valido, ed 1 altrimenti.
void controllo_puntegaitura(FILE *fTempPtr, char pTemp)
{
while(fscanf(fTempPtr, "%c", &pTemp) == 1 && ispunct(pTemp) == 0 && pTemp != '\n')
{
}
}
*/
void stampa_spazi(int num_spazi)
{
for(size_t i = 0; i < num_spazi; i++)
{
printf(" ");
}
}
Per risolvere il problema pensavo di scorrere una riga due volte(usando due puntatori): se trovo un carattere non-alfanumerico stampo il messaggio d'errore, altrimenti mi posiziono all'inizio della riga e la stampo. Però non saprei come scrivere il codice.
[EDIT]
Ho risolto il problema con la funzione fseek.