Вопрос

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

Но когда я пытаюсь выполнить код, он не помещает зашифрованные данные в новый файл. Это просто оставляет это пустым. Кто-то, пожалуйста, найдите то, что отсутствует в коде. Я пытался, но я не мог понять это.

Я думаю, что что-то не так с функцией чтения / записи или, возможно, я неправильно реализую петлю Do-Whi.

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>


int main (int argc, char* argv[]) 
{
    int fdin,fdout,n,i,fd;
    char* buf;
    struct stat fs;

    if(argc<3)
        printf("USAGE: %s source-file target-file.\n",argv[0]);

    fdin=open(argv[1], O_RDONLY);
    if(fdin==-1)
        printf("ERROR: Cannot open %s.\n",argv[1]);

    fdout=open(argv[2], O_WRONLY | O_CREAT | O_EXCL, 0644);
    if(fdout==-1)
        printf("ERROR: %s already exists.\n",argv[2]);

    fstat(fd, &fs);
    n= fs.st_size;
    buf=malloc(n);

    do
    {
        n=read(fd, buf, 10);

        for(i=0;i<n;i++)
            buf[i] ^= '#';

        write(fd, buf, n);
    } while(n==10);

    close(fdin);
    close(fdout);
}
Это было полезно?

Решение

// Here...
fstat(fd, &fs);

// And here...
n=read(fd, buf, 10);

for(i=0;i<n;i++)
    buf[i] ^= '#';

write(fd, buf, n);

Вы читаете и пишу fd вместо fdin а также fdout. Отказ Убедитесь, что вы включаете все предупреждения, которые ваш компилятор выделяет (например, использование gcc -Wall -Wextra -pedantic). Он предупреждает вас об использовании неинициализированной переменной, если вы его позволите.

Кроме того, если вы проверили обратные коды fstat(), read(), или write(), Вы, скорее всего, получили ошибки от использования неверного файлового дескриптора. Скорее всего, они ошибаются с ошибками Einval (неверный аргумент).

fstat(fd, &fs);
n= fs.st_size;
buf=malloc(n);

А поскольку мы здесь: выделение достаточно памяти, чтобы удерживать весь файл ненужным. Вы только читаете 10 байтов одновременно в вашем цикле, поэтому вам действительно нужно всего 10 байтового буфера. Вы можете пропустить fstat() полностью.

// Just allocate 10 bytes.
buf = malloc(10);

// Or heck, skip the malloc() too! Change "char *buf" to:
char buf[10];

Другие советы

Вы используете FD вместо FDIN в FSTAT, чтение и системных вызовов. FD - неинициализированная переменная.

Все сказано, что это правда, еще один совет.

Вы должны использовать более крупный буфер, который соответствует блокам жесткого диска системы, обычно 8192. Это будет значительно увеличить скорость вашей программы, поскольку у вас будет меньше доступа к диску в 800 раза. Как вы знаете, доступ к диску очень дорого в Условия времени.

Другой вариант использует функции STDIO FREAD, FWRITE и т. Д., Которые уже заботятся о буферизации, тем не менее у вас будет накладные расходы на вызов функции. Рон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top