Проблема в коде с файловыми дескрипторами.C (Linux) - PullRequest
0 голосов
/ 05 сентября 2010

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

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

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

#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);
}

Ответы [ 3 ]

3 голосов
/ 05 сентября 2010

Вы используете fd вместо fdin в fstat, для чтения и записи системных вызовов.fd - неинициализированная переменная.

2 голосов
/ 05 сентября 2010
// 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];
0 голосов
/ 06 сентября 2010

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

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

Другой вариант - использовать функции stdio fread, fwrite и т. д., которые уже позаботились о буферизации, но вы все равно 'Вы получите служебный вызов.Рони

...