KUBA TM Opublikowano 11 Lutego 2009 Zgłoś Opublikowano 11 Lutego 2009 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; } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...