2015-09-12 3 views
-1

Я пытаюсь реализовать команду displaycontent, которая принимает текстовое имя файла в качестве аргумента и отображает его содержимое. Я должен использовать open(), read(), write() и close() системные вызовы в Linux для этого. Он должен действовать как команда UNIX cat для отображения содержимого файла.Использование системных вызовов (открытие, чтение, запись) для отображения содержимого файла

Вот то, что я до сих пор:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    int fd; 
    char content[fd]; 

    errno = 0; 
    fd = open(argv[1], O_RDONLY); 


    if(fd < 0) 
    { 
     printf("File could not be opened.\n"); 
     perror("open"); 
     return 1; 
    } 
    else 
    { 

     read(fd, content, sizeof(content)-1); 
     write(1, content, sizeof(content)-1); 
    } 

return 0; 
} 

У меня есть файл с именем hello2.txt и в нем есть текст: hellooooooooooooooo

Когда я ./displaycontent hello2.txt, я получаю:

[email protected]:~/Desktop/Csc332/csc332lab$ ./displaycontent hello2.txt 
hellooooooooooooooo 
����>k���[`�s�b��[email protected]:~/Desktop/Csc332/csc332lab$ 

Есть странные символы и вещи, следующие за содержимым файла. Я не уверен, что не так, любая помощь будет оценена. Спасибо.

+5

'char content [fd];' Что? – EOF

+0

@devbrs, похоже, вы забыли использовать 'close()'. – donjuedo

+0

@donjuedo: файловые дескрипторы автоматически закрываются при завершении программы. – EOF

ответ

3

использовать bytes = read (fd,content,sizeof(content)-1); для записи числа прочитанных байтов. Затем используйте байты в write(1,content,bytes); только для записи байтов, которые были прочитаны. - user3121023

+0

И 'bytes' должен иметь тип' ssize_t'. – alk

2

fd не инициализирован, поэтому размер content не определен.

В любом случае вы не должны использовать fd. Вы можете использовать большое фиксированное число, если это всего лишь упражнение. В противном случае вы хотите получить размер файла и использовать его.

Чтобы получить длину файла, вы можете следовать этому примеру:

#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 

int main() 
{ 
    int fd = open("testfile.txt", O_RDONLY); 
    if (fd < 0) 
     return 1; 

    off_t fileLength = lseek(fd, 0, SEEK_END); // goes to end of file 
    if (fileLength < 0) 
     return 1; 

    // Use lseek() again (with SEEK_SET) to go to beginning for read() call to follow. 
    close(fd); 
    return 0; 
} 

(я не компилируюсь это сегодня, и я только собираюсь из памяти Если есть опечатки, они должны быть незначительными.)

+2

Даже если это исправлено, вероятно, все еще будет нежелательный выход. «Write» выводит весь буфер, а не только то, что было прочитано. – kaylum

+0

Вы правы. Я добавил к моему ответу, когда вы прокомментировали. :-) – donjuedo

Смежные вопросы