Wyświetlanie tekstu wczytanego z pliku

0

Cześć wszystkim,

Dość dziwne rzeczy dzieją się w moim programie wczytującym słownik "English.txt" (w załączniku) do tablicy dynamicznej. Podczas zapisywania słów w tablicy pomijam '/n', tak więc według mnie każdy wiersz tablicy dynamicznej powinien się składać ze słowa oraz '/0' tuż po nim. Pomimo tego, funkcja strlen twierdzi, że słowo w pierwszej linijce ma 4 znaki (w rzeczywistości 3, jest to słowo "AAA"). Ponadto nie mogę wyświetlić 8 pierwszych wyrazów, jeśli nie użyję '\n' po wyświetleniu każdej linijki (po odkomentowaniu linii "// printf("\n");" działa OK). Czy ma ktoś pomysł co może być tego przyczyną?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main()
{
    FILE *fp;
    char wczytane[32];
    int r;
    int n;
    int i,j;

    if ((fp = fopen("English.txt", "r")) == NULL)
    {
        perror("Nie udalo sie otworzyc pliku English.txt");
        return 1;
    }

    n = 0;
    while ((r = fscanf(fp, "%*40s")) != EOF)
        n++;

    if (ferror(fp) != 0)
    {
        fprintf(stderr, "error: read file" "\n");
        fclose(fp);
        return 1;
    }

    if (n == 1)
        printf("Slownik ma %d slowo." "\n", n);
    else
        printf("Slownik ma %d slow." "\n", n);

    char** slow_ang = (char**)malloc(n * sizeof (*slow_ang));   /* 1 */
    for(i=0; i<n; ++i)                                          /* 2 */
    {
        slow_ang[i]= (char*)malloc(32 * sizeof (**slow_ang));
    }

    rewind(fp);

    for(i=0; fgets(wczytane, sizeof wczytane, fp); i++)
    {
        for(j=0; wczytane[j]!='\n'; j++)
            slow_ang[i][j]=wczytane[j];
    }

// wyswietlanie 8 pierwszych wyrazów
    for(i=0; i<8; i++)
    {
        for(j=0; slow_ang[i][j]!='\0'; j++)
            printf(",%c", slow_ang[i][j]);
//        printf("\n");
    }

    printf("\nPierwsze slowo ma dlugosc: %zu", strlen(slow_ang[0]));

    for(i = 0; i < n; ++i)
        free(slow_ang[i]);
    free(slow_ang);
}
0

zapoznaj się z funkcją strcpy() oraz z formatem printf - %s

0

Dzięki za odpowiedź :) Ok, strcpy mogłoby pomóc, lecz musiałbym za pewne zrezygnować z tablicy dwuwymiarowej na rzecz jednowymiarowej (strcpy kończy wczytywać po odnalezieniu '\0'). Gdyby jednak zależało mi na tym, żeby tablica była dwuwymiarowa i każdy wyraz był w osobnym wierszu?

0

PROBLEM ROZWIĄZANY. Jestem użytkownikiem Linuxa, a plik txt, który odczytuję był prawdopodobnie napisany w Windowsie. Okazuje się, że Windows jako znak linii końcowej używa w plikach '\r\n', a Linux jedynie '\n'. Ponieważ przy zapisywaniu do tablicy użyłem warunku:

for(j=0; wczytane[j]!='\n'; j++)
    slow_ang[i][j]=wczytane[j];

w tablicy zapisywany był wyraz+'\r'. Poprawnie powinno to wyglądać tak:

for(j=0; wczytane[j]!='\r'; j++)
    slow_ang[i][j]=wczytane[j];

Źródło informacji: http://en.wikipedia.org/wiki/Newline

0
zaslon napisał(a):

PROBLEM ROZWIĄZANY. Okazuje się, że Windows jako znak linii końcowej używa w plikach '\r\n', a Linux jedynie '\n'.

Chrzan totalny, no chyba że pod linuksem odczytujesz plik stworzony pod windowsem.
A to co podałeś tak czy owak nie jest problemem w tym kodzie.

0

Wiem, że ten kod może mieć różne inne wady, nie jest napisany idealnie, ale w tej postaci działa poprawnie. Jeśli napisałem coś niezgodnego z prawdą, to proszę mnie poprawić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1