Witam. Muszę zrobić dwuwymiarową tablicę znaków pobraną z pliku.txt. Chodzi mi o to, żeby każdy znak był przypisany do danej komórki (np. tab[0][0] = 'T', tab[0][1] = 'A', tab[0][2] = 'K'). Napisałem oddzielne funkcje na liczenie kolumn, wierszy i się zatrzymałem. Mógłby mi ktoś wyjaśnić ten algorytm ?
Pokaż to już zrobiłeś, plik z danymi, oraz napisaną z palca tablicę wynikową jaka ma na jego podstawie powstać.
Liczydła
int length_counter(FILE *maze)
{
int length_line = 0;
char ch;
while((ch = fgetc(maze)) != '\n')
{
length_line++;
}
return length_line;
}
int number_rows(FILE *maze)
{
int rows = 0;
char ch;
while((ch = fgetc(maze)) != EOF)
{
if(ch == '\n')
rows++;
}
return rows;
}
Moja biedna funkcja
while(1){
while((matrix[i][j++] = fgetc(maze)) != '\n'){
}
i++;
}
FILE * maze;
char i = 0, j = 0;
int length_line = length_counter(maze);
int rows = number_rows(maze);
char matrix[rows+1][length_line+1];
for(i=0; i<rows; i++)
{
for(j=0; j<length_line; j++){
printf("%c", matrix[i][j]);
}
}
Tak to ma wyglądać po wczytaniu.
#######@#####
####....#####
#....########
........#####
#####$#######
Bardzo dobrze, to jeszcze zawartość pliku z danymi poprosimy, tak aby było wiadomo, co się finalnie ma przełożyć na poniższe:
#######@#####
####....#####
#....########
........#####
#####$#######
co ważne - upewnij się, że ten wynik co podałeś jest prawidłowy
EDIT do "Tak to ma wyglądać po wczytaniu": Identycznie wygląda to w pliku tekstowym. Dodam od razu, że jak wyświetlę to za pomocą while i fgetc. to wyświetla tak jak pokazałem, ale zależy mi na tablicy 2D.
Ok, to zatem tak:
- czytasz z pliku ile wierszy i ile kolumn będzie potrzebne do stworzenia tablicy
- tworzysz tablicę przy pomocy kodu:
char **table = (char**) malloc(rows * columns * sizeof(char));
//użycie takiego twora klasycznie, czyli np tab[0][1]
- w razie potrzeby przestawiasz file pointer na jego początek, i używasz
getline()
aby wczytać pełen wiersz z pliku; oczywiście pamiętaj o właściwym nastawieniu parametrów dlagetline()
- powtarzasz krok 3 póki nie będą wczytane wszystkie wiersza
char **matrix =(char**)malloc(rows*columns*sizeof(char));
rewind(maze);
for(i=0; i<rows; i++)
{
for(j=0; j<columns; j++)
{
matrix[i][j] = getline(matrix, size_t*columns, maze);
}
}
for(i=0; i<rows; i++)
{
for(j=0; j<columns; j++)
{
printf("%c", matrix[i][j]);
}
}
Dodałem biblioteke <stddef.h>
Plik też mam otworzony.
I pojawia mi się błąd.
error: expected expression before 'size_t'|
No to takie pytanie - czy wewnętrzna pętla for jadąca po kolumnach jest potrzebna, czy zbyteczna?
Rzeczywiście jest to nielogiczne.
EDIT:
int nbytes = rows*columns*sizeof(char*);
for(i=0; i<rows; i++)
{
getline(&matrix, &nbytes, maze);
}
Teraz dostałem komunikat: undefined reference to 'getline'. Przeczytałem, że w czystym C nie mogę użyć getline, ponieważ go tam nie ma. Nie mam konieczności pisania w czystym C, ale nie mogę znaleźć biblioteki którą mógłbym dołączyć.
Ach, racja. Dla C będzie to fgets