• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z wczytaniem polskich znaków z pliku tekstowego (Język C)

Cloud VPS
+1 głos
623 wizyt
pytanie zadane 19 kwietnia 2023 w C i C++ przez Quba Użytkownik (870 p.)

Witam wszystkich mam problem z wczytaniem polskich znaków z pliku tekstowego na ekran.

Program wygląda w ten sposób:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#pragma warning(disable: 4996)

int main()
{
    setlocale(LC_CTYPE, "Polish");
    FILE* plik, * plik2;
    char znak, szukany, szukany_napis[2];
    int i = 0, i1, j = 0, enter = 0, enter1, raz = 0, x = 0, x1, Czy_Enter = 0, pomoc=0;

    plik = fopen("tekst_2.txt", "r");
    if (plik == NULL)
    {
        printf("Niestety nie udało się otworzyć tekstu 2.");
        return 1;
    }

    printf("=============== Tekst 2 =================\n\n");

    while ((znak = fgetc(plik)) != EOF)
    {
        printf("%c", znak);
    }

    printf("\n\n=========================================\n\n");
    printf("Wybierz jeden z powyższych znaków Tekstu 2 aby znaleźć pierwsze jego wystąpienie w Tekście 1:\n");

    do
    {
        if (raz > 0 && j==0)
        {
            for (int i = 0; i < pomoc; i++)
            {
                getchar();
            }
        }
                                              
        char* wejscie = (char*)malloc(256 * sizeof(char)); //alokujemy tablice z pewną ilością znaków (+znak końca linii)
        fgets(wejscie, 256, stdin);
        int pomoc = strlen(wejscie)-1; //odjac 1 aby nie liczyc znaku konca linii

        szukany = wejscie[0];
        free(wejscie); //zwalniamy zaalokowaną pamięć

        szukany_napis[0] = szukany;

        rewind(plik);
        while ((znak = fgetc(plik)) != EOF)
        {
            if ((strchr(szukany_napis, znak) != NULL) && j < 1 && pomoc==1)
            {
                j++;
            }
        }
        if (j == 0)
        {
            printf("Niestety tego znaku nie ma w powyższym tekście lub podałeś ciąg znaków. Podaj pojedynczy znak ponownie:\n");
        }

        raz++;

    } while (j == 0);

    fclose(plik);

    //=================================================================================================================================

    j = 0;

    plik2 = fopen("tekst_1.txt", "r");
    if (plik2 == NULL)
    {
        printf("Niestety nie udało się otworzyć tekstu 1.");
        return 1;
    }

    printf("\n\n============ Tekst 1 z zaznaczonym pierwszym wystąpieniem znaku \"%c\" ================\n\n", szukany);

    szukany_napis[0] = szukany;
    szukany_napis[1] = '\0';

    printf("  %d   ", enter);
    //rewind(plik2);
    while ((znak = fgetc(plik2)) != EOF)
    {
        if (Czy_Enter == 1)
        {
            printf("%3d   ", enter);
            Czy_Enter = 0;
        }
        x++;
        if ((strchr(szukany_napis, znak) != NULL) && j < 1)
        {
            j++;
            i1 = i;
            enter1 = enter;
            x1 = x;
            printf("[ => %c <= ]", znak);
            continue;
        }
        if (znak == '\n')
        {
            enter++;
            Czy_Enter = 1;
            x=0;
        }
  
        printf("%c", znak);
        i++;
    }
    if (j != 1) printf("\n\nBRAK ZAZNACZENIA - BRAK ZNAKU!");
    printf("\n\n================================== Informacje ===================================\n\n");
    if (j == 1) printf("Znaleziono znak \"%c\" w tekście 1.\nWiersz: %d\nPozycja w wierszu: %d\nPozycja w całym tekście: %d\n\n", szukany, enter1, x1-1, i1 - enter1);
    else printf("Niestety nie znaleziono znaku \"%c\" w tekście 1.\n\n", szukany);

    fclose(plik2);

    return 0;
}

Próbowałem już wielu rzeczy i nadal jest ten sam efekt, a mianowicie taki, że wyświetlanie polskich znaków poprzez np. "printf("Wybierz jeden z powyższych znaków Tekstu 2 aby znaleźć pierwsze jego wystąpienie w Tekście 1:\n");" działa bez zarzutów ale w momencie, w którym chcę wyświetlić zawartość notatnika, w którym występują polskie znaki to pojawią się krzaczki.

Poniżej zawartości plików tekst_2.txt oraz tekst_1.txt

(tekst_2.txt)

abcde 4356
fg h123
ijQ OPVB
k? !$
x %^ mp
ółżń

(tekst_1.txt)

Na pokładzie samolotu Greene zawiera umowę z CIA, w ramach której w zamian za dostęp do ropy Stany Zjednoczone nie sprzeciwią się przewrotowi w Boliwii. W Austrii Greene uczestniczy w przedstawieniu Toski Pucciniego w operze w Bregencji. Bond podąża jego tropem, w operze zabija członka organizacji i kradnie mu nadajnik do porozumiewania się z terrorystami. W rzeczywistości przedstawienie Toski jest przykrywką dla spotkania członków organizacji o nazwie Quantum. Terroryści omawiają najważniejsze sprawy dotyczące ich globalnych operacji. Bond przerywa spotkanie i robi zdjęcie uciekającym członkom Quantum, które wysyła do M. Wśród spiskowców jest Guy Haines – zaufany doradca premiera Wielkiej Brytanii. W trakcie ucieczki z opery Bond rzekomo zabija agenta służb specjalnych, ochraniającego Hainesa. Z tego powodu M nakazuje sprowadzić agenta 007 z powrotem do siedziby MI6[1][4].

2 odpowiedzi

0 głosów
odpowiedź 20 kwietnia 2023 przez j23 Mędrzec (195,240 p.)

Krótko:

  • Notatnik działa w kodowaniu ANSI → Windows-1250 (w PL)
  • konsola śmiga w kodowaniu OEM → CP852 (w PL)
0 głosów
odpowiedź 20 kwietnia 2023 przez disaster Bywalec (2,120 p.)
Myślę, że chodzi o rodzaj formatowania.
Spróbuj swój plik txt otworzyć w Notepad++ następnie wybierz format i zapisz w formacie ANSI lub innym - kombinuj UTF8 często też działa

Możesz spróbować swój kod również przekonwertować na ANSI w taki sam sposób ;)
komentarz 20 kwietnia 2023 przez Quba Użytkownik (870 p.)
Zrobiłem tak, w formacie ANSI poprawnie wyświetla wszystkie polskie znaki jednak dalej w programie chcę pobrać jeden ze znaków z pliku (tekst_2.txt). Każdy znak pobiera się bez problemu poza znakami polskimi. Znaków polskich nie rozpoznaje i ich nie widzi i wyświetla mi komunikat z programu o treści: "Niestety tego znaku nie ma w powyższym tekście lub podałeś ciąg znaków. Podaj pojedynczy znak ponownie:".
komentarz 21 kwietnia 2023 przez TOWaD Mądrala (6,480 p.)
Ja się nieznam, ale czy wejście musi być z konsoli. Bo jak z pliku do pliku to pewnie będzie mniejszy problem.

Zawsze można użyć poleceń konsoli przez system(...) jakoś tak.

Ten komentarz może być kompletą bzurą, więc z góry przepraszam.

Podobne pytania

+1 głos
1 odpowiedź 866 wizyt
pytanie zadane 1 czerwca 2021 w C i C++ przez drequ Nowicjusz (130 p.)
0 głosów
1 odpowiedź 4,825 wizyt
pytanie zadane 17 maja 2017 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
0 odpowiedzi 790 wizyt
pytanie zadane 1 sierpnia 2018 w PHP przez lukii1717 Nowicjusz (140 p.)

93,457 zapytań

142,452 odpowiedzi

322,722 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...