Jump to content
KUBA TM

C++ Wyswietlanie Znakow

Recommended Posts

Mam problemik. Mialem napisac program ktory który po wczytaniu nazw plików dokona porównania ich zawartości względem ilości znaków drukowanych, znaków specjalnych oraz wyrazów i porowna w postaci tabelarycznej. Wszystko fajnie do pewnego momentu... Funkcje programu dzialaja lecz nie do konca poprawnie sa wyswietlane znaki (sa 3 uchybienia). Co wiecej, liczba wyrazow nie jest poprawnie wyswietlana.
Prosze o pomoc


Kodzik:

#include <cstdlib> #include <conio.h> #include <iostream> #include <windows.h> //Biblioteka z funkcjami windowsowskimi using namespace std;  void menu(void) //Funkcja wyświetlająca menu programu {	  system("cls");	  HANDLE kon = GetStdHandle(STD_OUTPUT_HANDLE); //Kolorowanie tekstu	  SetConsoleTextAttribute (kon,10);	  printf ( "\n\t\t PROGRAM POROWNUJE DWA PLIKI TEKSTOWE ORAZ WYSWIETLA" );	  printf ( "\n\t\t		ICH ZAWARTOSC W POSTACI TABELARYCZNEJ ");	  printf ( "\n" );	  SetConsoleTextAttribute (kon,15);	  //MENU	  printf("\n---------------------"); 	  printf("\nOpcje");	  printf("\n---------------------");	  printf("\n[0]. Wczytaj pliki");	  printf("\n[1]. Analizuj");	  printf("\n[2]. Wyswietl wynik");	  printf("\n[3]. Zapisz raport do pliku");	  printf("\n[4]. Zakoncz");	  printf("\n---------------------");	  printf("\n\nWybierz opcje: "); }  void wczytaj(char &plik1_name, char &plik2_name) //Funkcja wczytująca nazwy plików (Argumenty przekazywane przez referencje) {	  system("cls"); // Czyszczenie ekranu	  printf("Podaj nazwe 1-go pliku ktorego utworzyles: \n");	  scanf("%s", &plik1_name); // Wczytywanie ciągu znaków z klawiatury	  printf("Podaj nazwe 2-go pliku ktorego utworzyles: \n");	  scanf("%s", &plik2_name);	  strcat(&plik1_name, ".txt");	  strcat(&plik2_name, ".txt"); }  int analizuj_znaki(FILE *plik, char znak) //Funkcja analizująca plik pod kątem znaku {	 int ile = 0; //Zmienna ile jest danych znaków	 while(!feof(plik)) //Jeśli nie ma końca pliku	 {				 if(getc(plik) == znak) ile++; //Jeśli znak jest taki sam jak podany w argumencie funkcji to powiększ licznik (Inkrementacja)	 }	 fclose(plik); //Zamknij plik	 return ile; //Zwróć wartość }  int analizuj_wyrazy(FILE *plik) {	 int ile = 0;	 bool wyraz = false; //Zmienna oznaczająca że jesteśmy w trakcie analizy jednego z wyrazów	 char c;	 while(!feof(plik))	 {					c = getc(plik);					if(wyraz == false && (c != ' ' && c != '\n' && c != '\t' && c != '\0')) //Jeśli znak jest spośród wymienionych znaczy że jest częścią wyrazu					{						 wyraz = true;					} else if(wyraz == true && (c == ' ' || c == '\n' || c == '\t' || c == '\0'))//Jeśli analizujemy wyraz i znak jest białym znakiem to wtedy należy wyzerować informacje o analizie wyrazu oraz powiększyć licznik						   {									ile++; //Powiększanie licznika									wyraz = false;						   }						 }	 if(wyraz == true && feof(plik)) //Jeśli wyraz kończy znak \0 to należy równiez go dodać do listy			  ile++;	 fclose(plik);	 return ile; //Zwracanie ilości wyrazów }  int analizuj(char* plik_name, int c) //Funkcja wywołująca analizę znaków lub wyrazów {	 FILE *plik; //Wskaźnik na deskryptor pliku	 plik = fopen((const char*)plik_name, "r+"); //Otwieranie pliku do odczytu	 return ((c < 256) ? analizuj_znaki(plik, c) : analizuj_wyrazy(plik)); //Jeśli znak ma kod mniejszy od 256 to jest to znak a jeśli ma numer 256 to znaczy że należy analizować wyrazy }  void wyswietl_wynik(int typ, int a, int b) //Wyświetlanie wyniku (Argumenty przekazywane przez wartość) {	  if(typ < 256) //Wyswietlanie znaków	  {			 switch(typ) //Wyświetlanie białych znaków w ładniejszej postaci			 {						case ' ':							 printf("|  ' '  | %5d | %5d |\n", a, b);							 break;						case '\t':							 printf("| '\\t'  | %5d | %5d |\n", a, b);							 break;						case '\n':							 printf("| '\\n'  | %5d | %5d |\n", a, b);							 break;						case '\0':							 printf("| '\\0'  | %5d | %5d |\n", a, b);							 break;						case '\a':							 printf("| '\\a'  | %5d | %5d |\n", a, b);							 break;						case '\b':							 printf("| '\\b'  | %5d | %5d |\n", a, b);	  						default:							 printf("|%6c | %5d | %5d |\n", typ, a, b);							 break;			 }	  } else printf("|wyrazy | %5d | %5d |\n", a, b); //Wyświetlanie wyrazów }  void zapisz_do_pliku(int *wyniki1, int *wyniki2) //Funkcja zapisująca raport do pliku (Argumenty przekazywane przez wskaźnik) {	  FILE *plik; //Wskaźnik na deskryptor pliku	  char *plik_name; //Nazwa pliku do zapisania	  plik_name = new char[255]; //Tworzenie zmiennej dynamicznej o rozmiarze 256 bajtów (256 * char)	  	  system("cls");	  printf("Podaj nazwe pliku oraz rozszerzenie w jakim chcesz go zapisac: \n");	  scanf("%s", plik_name);	  	  plik = fopen(plik_name, "w+");	  	  for(int i = 0;i <= 256;i++)	  {			  if(i < 256)			  {				   switch(i)				   {							case ' ':								 fprintf(plik, "|  ' '  | %5d | %5d |\n", wyniki1[i], wyniki2[i]); //Zapisywanie danych do pliku								 break;							case '\t':								 fprintf(plik, "| '\\t' | %5d | %5d |\n", wyniki1[i], wyniki2[i]); 								 break;							case '\n':								 fprintf(plik, "| '\\n' | %5d | %5d |\n", wyniki1[i], wyniki2[i]); 								 break;							case '\0':								 fprintf(plik, "| '\\0' | %5d | %5d |\n", wyniki1[i], wyniki2[i]); 								 break;							case '\a':								 fprintf(plik, "| '\\a' | %5d | %5d |\n", wyniki1[i], wyniki2[i]);								 break;							case '\b':								 fprintf(plik, "| '\\b' | %5d | %5d |\n", wyniki1[i], wyniki2[i]);								 break;									default:									fprintf(plik, "|%6c | %5d | %5d |\n", i, wyniki1[i], wyniki2[i]);									break;				   }			  } else fprintf(plik, "|wyrazy | %5d | %5d |\n", wyniki1[i], wyniki2[i]);	  }	  	  fclose(plik);	  delete plik_name; //Zwalnianie pamięci zajmowanej przez zmienną dynamiczną }  void error(int id) {	  switch(id)	  {				case 1:					 printf("\nMusisz najpierw wczytac pliki!\n");					 break;				case 2:					 printf("\nMusisz najpierw przeanalizowac oba pliki!\n");					 break;				case 3:					 printf("Nie ma tej opcji!\n");					 break;	  }	  system("pause"); }  int main(int argc, char *argv[]) {	 bool koniec=false; //Zmienna oznaczajaca zakonczenie programu	 char analiza = 0; //Zmienna służaca do zabezpieczenia przed zbyt szybkim wyświetlaniem wyniku	 char *plik1_name, *plik2_name; //Nazwy plików	 int menu_wybor; //Zmienna przetrzymująca numer wybranej przez usera opcji	 int wyniki1[256], wyniki2[256]; //Wyniki analizy danych przez program	 	 memset(wyniki1, 0, sizeof(int) * 256); //Zerowanie tabel wynikow (int = 4 bajty więc 256 * 4 bajtów zostaje zerowanych)	 memset(wyniki2, 0, sizeof(int) * 256);	 plik1_name = new char[255]; //Tworzenie dynamicznej tablicy znaków (zmiennej tekstowej)	 plik2_name = new char[255];	 	 while(!koniec)	 {				   fflush(stdin); //				   menu(); //Wyświetlenie menu				   scanf("%d", &menu_wybor);				   if(menu_wybor < 0 || menu_wybor > 4) //Sprawdzanie czy użytkownik podał dozwoloną wartość				   {									error(3);									continue;				   }				   				   switch(menu_wybor)				   {									 case 0:										  analiza++; //Powiększanie poziomu uprawnień										  wczytaj(*plik1_name, *plik2_name);										  break;									 case 1:										  if(analiza < 1) //Jeśli poziom uprawnień jest mniejszy od 1, to znaczy że nie wczytano pliku										  {													 error(1); //Wyświetlenie komunikatu z błędem													 break;										  } else analiza++;										  for(int i = 0;i <= 256;i++)										  {												  wyniki1[i] = analizuj(plik1_name, i);												  wyniki2[i] = analizuj(plik2_name, i);										  }										  break;									 case 2:										  if(analiza < 2) //Jeśli poziom uprawnień jest mniejszy od 1, to znaczy że nie przeanalizowano pliku										  {													 error(2);													 break;										  }										  system("cls");										  for(int i = 0;i <= 256;i++)												  wyswietl_wynik(i, wyniki1[i], wyniki2[i]);										  system("pause");										  break;									 case 3:										  if(analiza < 2)										  {													 error(2);													 break;										  }										  zapisz_do_pliku(wyniki1, wyniki2);										  break;									 case 4:										  koniec=true;										  break;				   }	 }	 	 delete plik1_name;	 delete plik2_name;	 	 return EXIT_SUCCESS; }

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...




×
×
  • Create New...