При чтении в конец файла добавляется дополнительный символ - PullRequest
0 голосов
/ 09 мая 2020

Я копирую файл из linux в нашу файловую систему, что мы успешно сделали, однако, когда файл распечатывается, в конце файла появляются лишние символы. Мы думаем, что это связано с распределением памяти, но не видим, как это исправить. Спасибо за помощь!

ФАКТИЧЕСКИЙ EOF: ∴ Но ни одна TM не может решить H, поэтому M_o не может существовать. не могло существовать.

void copyToFS(char *filePath, int currentDirectoryID)
{
    printf("Enter file path: ");
    scanf("%s",filePath);
    int node = assignNode(filePath, 0, currentDirectoryID);
    long int fileSize = getFileSize(filePath);

    FILE *file  = fopen(filePath, "r");

    printf("\nSize of : %ld", fileSize);

    char fileBuffer[fileSize];

    if (file != NULL) {
        fseek(file, 0, SEEK_SET);
        fread(fileBuffer, fileSize, 1, file);

    } else {
        printf("Could not open file :(");
    }

    fclose(file);

    printf("\n%s", fileBuffer);

    assignBlocks(fileBuffer, node, fileSize/512);
}

1 Ответ

0 голосов
/ 11 мая 2020

Здесь есть несколько проблем. Начнем с вопроса, касающегося вашего вопроса:

Во-первых, fileBuffer содержит содержимое файла. Это нормально, за исключением того, что %s printf() ожидает C -строку, а не содержимое файла. Разница в том, что строка C заканчивается нулевым байтом \0.

Тогда у вас есть предположение, что файл содержит только текст. Если файл двоичный и, в частности, если он где-то содержит нулевой байт, ваша печать не будет работать.

Как исправить обе проблемы: используйте fwrite(), для которого нулевой байт не нужен: замените

printf("\n%s", fileBuffer);

на

fwrite("\n", sizeof("\n"), 1, STDOUT);
fwrite(fileBuffer, fileSize, 1, STDOUT);

Далее, есть предположение о размере файла. Если размер файла составляет 16 МБ, вы попытаетесь выделить в стеке 16 МБ памяти, что приведет к тому, что ваша программа будет cra sh.

Как исправить: либо подтвердите предположение (if (fileSize > SOMETHING) return;, либо что-то подобное) или динамически выделять fileBuffer с помощью malloc().

Далее, вы не обрабатываете ошибки из fread(). Если это не удалось, fread() вернет 0.

Как исправить: пуленепробиваемый способ - иметь al oop как:

while (!feof(file)) {
    fread(fileBuffer, fileSize, 1, file);
}

НО, если ваш файл может быть большим, fread() может читать только его часть, и вам нужно:

n = 0;
while (!feof(file)) {
    r = fread(fileBuffer + n, 1, fileSize, file);
    n += r;
}

Обратите внимание, что когда вы пишете файл (в assignBlocks(), я полагаю), если вы используете fwrite(), вам также понадобится al oop, аналогичный fread().

Наконец, я предполагаю, что fileSize/512 должно быть количеством секторов в файле, но если файл составляет 1500 байт long, у него будет 3 сектора, тогда как fileSize/512 будет оцениваться как 2.

Как исправить: заменить fileSize/512 на (fileSize + 511) / 512.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...