PDA

Visualizza la versione completa : [C] Acquisizione e stampa stringhe


pascal90
27-12-2007, 17:58
sto cercando di fare una routine di stampa che leggendo da file di testo un testo, lo stampi a video rispettando le dimensioni della console del C, e cioè 80x25 caratteri, però sto trovando molti problemi:
leggo un carattere alla volta, e memorizzo tutto nella variabile "parola", e quindi cerco di acquisire una parola alla volta e stamparla, cosi che se una parola poi alla fine della riga nn ci sta interamente, mando a capo e la stampo sulla nuova riga. però il programma non so perchè ma a volte mi spezza ancora le parole alla fine mandando a capo a metà parola e non mandandola a capo tutta intera.
ho provato a vedere quale può essere l'errore ma niente da fare . nn riesco a risolvere, il problema sta nel fatto che quando leggo da testo il carattere e lo memorizzo in ch, e poi faccio il controllo di cosa è ch con gli "if", molte volte me lo sballa, e mi vede ad esempio una "n" come un simbolo, pur avendola inserita all'interno del vettore "lettere", e cosi mi tronca le parole e ad esempio un seplice "signora" me lo vede come 3 parole divise in "si" "gnor" "a"... perchè?
facendo cosi tutto il lavoro del mandare a capo una parola intera se nn ci sta sulla riga diventa inutile siccome cmq nn mi vede le parole intere e quindi me le tronca cmq...

ecco il prog col file allegato per la prova:
http://rapidshare.com/files/79438391/sherlock_holmes.rar.html





#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>

main()
{
FILE *c;
char str[10000];//nn guardatela
char ch;
char parola[100];
char spazio[14]={" "};// faccio cosi perchè nn so come fare un char che significhi "spazio"... allora faccio controllare al programma se il simbolo sarà uguale a uno degli spazi contenuti in sto vettore
char segnidiinterruzione[4]={',',';','!','?'};//non sono tutti ma tanto è per provare
char altrisimboli[4]={'[',']','(',')'};//lo stesso
char lettere[63]={'0','0','1','2','3','4','5','6','7','8','9','a', 'b','c','d','e','f','g','h','i','l','m','n','o','p ','q','r','s','t','u','v','z','x','y','k','j','w', 'A','B','C','D','E','F','G','H','I','L','M','N','O ','P','Q','R','S','T','U','V','Z','X','Y','W','J'} ;
char var;
int z=0;//indice per il ciclo
int h=0;
int lunghezza;//lunghezza stringa
int ris;//nn guardatelo
int y=0;//contatore delle righe passate
int x=0;//contatore dei caratteri su una riga
int MAX=76;//numero massimo di caratteri su una riga, vorrei mettere che scriva tra: 2 spazi prima di iniziare, e 2 spazi prima di finire la riga...,
int band=0;
int inizio=0;


c = fopen("prologo1.txt", "r"); //apro il file
while(!feof(c)) //ciclizzo fino a fine file
{
ch = fgetc(c);//piglio il carattere


while(1)//ciclizzo infinito
{
z++; //aumento z di 1
if (ch==lettere[z]) //se il carattere è la lettera a posizione z eseguo...
{
parola[h]=ch; // memorizzo il carattere in parola h
h++; //aumento di 1 h
break; //esco dal ciclo
}

if (ch==segnidiinterruzione[z]) //conmtrollo che ch sia un segno di interruzione
{

parola[h]=ch; // memorizzo ch in nella stringa parola, in posizione h
h++; //incremento h di 1
parola[h]='\0'; //termino la stringa
band=1;
break;
}
else if (ch==altrisimboli[z])
{
parola[h]=ch;
h++;
break;
}
if (z==3)//ho messo 3, ma potevo metter anche 4 o 5, siccome sono tutte posizioni della stringa dove c'è lo spazio
{
if (ch==spazio[z])//se ch è uno spazio
{

parola[h]=' ';
h++;
parola[h]='\0';//se c'è lo spazio la strigna è finita quindi la termino
band=1;//pongo band=1 in modo che dopo possa stampare la stringa
break;
}
}

}
if (band==1)//se la parola è finita
{
lunghezza=strlen(parola);//memorizzo il numero dei caratteri in lunghezza
x=x+lunghezza;//sommo la lunghezza della stringa
if (x>MAX)//se il numero di caratteri della parola è maggiore di MAX(numero massimo di caratteri che può contenere una riga)
{
printf("\n");//vado a capo
printf(" ");
x=0;//riazzero x
x=x+lunghezza;//ripongo x uguale ad h, cioè i caratteri contenuti nella nuova riga
y++;//aumento y che è la variabile che mi serve a contare quante righe son passate
if (y==24)//se son 24 è finita la pagina, e vado "a capo" nell'altra...
{
var=getch();//lo metto per stoppare la schermata e permettere di leggere tutto
y=0;
system("cls");
printf(" ");
}
}
//else x=x+lunghezza;//se è minore di max, sommo x(lettere stampate fino a qui) a lunghezza
if (inizio==0)
printf(" ");
printf("%s",parola);//stampo a video la parola
inizio=1;
//riazzero tutto
band=0;
h=0;
z=0;
}

}


fclose(c);


}




vi prego aiutatemi ;_;, son giorni e giorni che son fermo a questo punto e ho bisogno d'aiuto >_>...

Loading