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