Копирование содержимого файла в другой с использованием read (), write (), open () - PullRequest
1 голос
/ 10 февраля 2012

Я создал быструю программу, которая просто захватывает содержимое файла и переносит его в выходной файл.При первом запуске моей программы я не получаю ошибок, и все выглядит так, как будто все будет работать нормально.Однако, когда я проверяю свой выходной файл, в нем ничего нет.Моей первой мыслью было, что права доступа не верны, а запись запрещена.Когда я вручную создал в каталоге файл .txt и установил права доступа, а затем запустил программу, которая, как мне показалось, работала (ubuntu показывает мне содержимое файла, копию), но я не могу открыть сам файл.Надеюсь, кто-то с большим опытом, чем я, может мне помочь.Ну вот мой код:

int main(int argc, char* argv[]){
  char buf[128];
  int outft, inft,fileread;
  // output file opened or created
  if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR))==-1){
    perror("open");
  }
  // lets open the input file
  inft = open(argv[2], O_RDONLY);
  if(inft >0){ // there are things to read from the input
    fileread = read(inft, buf, 160);
    printf("%s\n", buf);
    write(outft, buf, 160);
    close(inft);
  }
  close(outft);
  return 0;
}

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Обязательно установите права доступа к файлу.

Пример:

if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666))==-1){
    perror("open");
  }
2 голосов
/ 10 февраля 2012

Ваш буфер данных имеет размер 128 байт, но вы считываете в него 160 байт данных. Это означает, что вы пишете в память за пределами объявленного буфера.

Я ожидаю, что переменные outft, inft, and fileread вероятно следуют за buf в памяти и перезаписываются мусором во время вызова read(). Вызов write(), вероятно, не удался, потому что он получает значение мусора для дескриптора файла для записи.

Чтобы избежать переполнения буфера, sizeof ваш друг:

fileread = read(inft, buf, sizeof(buf));
...
write(outft, buf, fileread);
...