Матрица символов, записанная в двоичном файле - PullRequest
0 голосов
/ 02 января 2019

У меня есть текстовый файл, из которого я читаю слова. После этого я должен записать в двоичном файле каждое слово и рядом с ним строку и столбец, где оно появляется. При _strdup (p) моя программа падает. Кто-нибудь знает почему? Буду признателен за вашу помощь. Вот код:

void create(const char *filename, const char ****matrix) {

    FILE *u, *f;
    u = fopen(filename, "wb");
    assert(u != NULL);
    f = fopen("in.txt", "r");
    assert(f != NULL);
    (*matrix) = (char ***)malloc(sizeof(char **) * 1);
    int i = 0;
    int j=0; char buff[1024];
    while (fgets(buff, 1024, f)!=NULL) {

        (*matrix) = realloc((*matrix), (i + 1) * sizeof(char **));
        char *p = strtok(buff, " ().,");
        (*matrix)[i] = (char **)malloc(sizeof(char *));
        while (p) {

                (*matrix)[i] = (char **)realloc((*matrix)[i], sizeof(char *)*(j + 1));
                strcpy((*matrix)[i], buff);
                (*matrix)[i][j] = _strdup(p);

                fwrite((*matrix)[i][j], sizeof(char *), 1, u);
                fwrite(&i, sizeof(int), 1, u);
                fwrite(&i, sizeof(int), 1, u);
                j++;

                (*matrix)[i][j] = NULL;

            p = strtok(NULL, " ().,");
        }
        (*matrix)[i] = NULL;
        i++;
        printf("\n");

    }
    fclose(u);
    fclose(f);
}

1 Ответ

0 голосов
/ 02 января 2019

Вызов _strdup, скорее всего, сбой, потому что память для (*matrix)[i][j] не была выделена должным образом.

Использовать столько указателей, сколько нужно для чтения слов из файла, не обязательно, ночто вы используете их, для каждого из них необходимо создать память в правильном порядке.

То есть

matrix = malloc(sizeof(char *));

- это первое из мест, необходимых перед созданиемлюбые другие

Например, метод создания правильно распределенной коллекции указателей для 4-мерного массива может выглядеть следующим образом:

char **** Create4D(int hR, int p, int c, int r)     
{
    char ****arr;
    int    w,x,y;

    arr = calloc(hR, sizeof(char *));
    for(w=0;w<hR;w++)
    {
        arr[w] = calloc(p, sizeof(char *));
        for(x=0;x<p;x++)
        {
            arr[w][x] = calloc(c, sizeof(char *));
            for(y=0;y<c;y++)
            {                                        
                arr[w][x][y] = calloc(r, 1); 
                                      // ^ sizeof(char) == 1
            }
        }
    }
    return arr;
}

Обратите внимание накурсивом напомним, что на самом деле это не матрица , а просто набор адресов памяти, некоторые с пространством для указателей, другие с пространством для строк char.

.вызовите эту функцию:

char ****matrix = Create4D(2, 4, 6, 8);
if(matrix)//always test for success.  If failed, matrix is set to NULL.
{ 
    //use matrix
    //With these arguments, 48 (2*4*6) pointers are created, 
    //each with space allocated to contain strings of 8 char each
    ....

Также обратите внимание, что во всех этих вызовах приведение возврата [m] [c] alloc здесь не используется, , потому что это не рекомендуется вC .Кроме того, если вы планируете создать всю эту память, соответствующие вызовы free() должны быть сделаны для каждого вызова calloc().

Память от вызова метода, описанного выше в моей системе, показана здесь:

enter image description here

...