Skocz do zawartości
KUBA TM

C++ Wyswietlanie Znakow

Rekomendowane odpowiedzi

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; }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...