C - чтение по основному вводу / выводу только чтение "\n"

У меня есть проблема в моей практике C-лекции. Мое упражнение состоит в том, чтобы прочитать текстовый документ (который находится в том же каталоге, что и программа) символ за символом и записать его в терминале (с конца до начала, символ с символом) в терминале (я должен работать в Ubuntu),

К сожалению, это не работает - "чтение" только читает символы новой строки (\n).

Можете ли вы найти мою ошибку?

#include <sys/stat.h> //mode_t: accessing rights for the file
#include <fcntl.h>   //for I/O
#include <unistd.h>  //for file descriptors
#include <string.h>  //for strlen


short const EXIT_FAILURE = 1;
short const EXIT_SUCCESS = 0;

char const* USAGE_CMD = "usage: write_file filename string_to_write\n";
char const* ERR_OPEN  = "error in open\n";
char const* ERR_READ  = "error in reading\n";
char const* ERR_CLOSE = "error in close\n";
char const* ERR_WRITE = "error in write\n";

int main(int argc, char** argv){

    int fd = open(argv[1], O_RDONLY);
    if(fd == -1){
        write(STDERR_FILENO, ERR_OPEN, strlen(ERR_OPEN));
        return EXIT_FAILURE;
    }

    int two_char_back = (-1)*sizeof(char);      //shift-value for char
    int one_back = -1;                              //shift-value for "no shift"
    int length = lseek(fd, one_back, SEEK_END);//setting to one before oef
    int i = 0;                                          //for the loop
    char buffer;
    char* pbuffer = &buffer;                        //buffer for writing
    while (i < length){
        if (read(fd, pbuffer, sizeof(buffer)) == -1){   //READING
            write(STDERR_FILENO, ERR_READ, strlen(ERR_READ));
            return EXIT_FAILURE;
        }

        if(write(STDOUT_FILENO, pbuffer, sizeof(buffer)) == -1){    //WRITING
            write(STDERR_FILENO, ERR_WRITE, strlen(ERR_WRITE));
            return EXIT_FAILURE;
        }

    lseek(fd, two_char_back, SEEK_CUR);         //STEPPING
    i++;
    }

    if(close(fd) == -1){                                //CLOSING
        write(STDERR_FILENO, ERR_CLOSE, strlen(ERR_CLOSE));
        return EXIT_FAILURE;    
    }

return EXIT_SUCCESS;

}

4 ответа

Решение

Большое спасибо за ваши советы! И спасибо моим коллегам!

Сейчас это работает, но я создал новую версию, вот она:

#include <sys/stat.h> //mode_t: accessing rights for the file
#include <fcntl.h>   //for I/O
#include <unistd.h>  //for file descriptors
#include <string.h>  //for strlen


short const EXIT_FAILURE = 1;
short const EXIT_SUCCESS = 0;

char const* USAGE_CMD = "usage: write_file filename string_to_write\n";
char const* ERR_OPEN  = "error in open\n";
char const* ERR_READ  = "error in reading\n";
char const* ERR_CLOSE = "error in close\n";
char const* ERR_WRITE = "error in write\n";

int main(int argc, char** argv){

    int fd = open(argv[1], O_RDONLY);           //OPENING
    if(fd == -1){
        write(STDERR_FILENO, ERR_OPEN, strlen(ERR_OPEN));
        return EXIT_FAILURE;
    }

    int file_size = lseek(fd, 0, SEEK_END); //setting to eof
    int i = file_size-1;                        //for the loop, runs from the end to the start
    char buffer;
                                                    //the files runs from the end to the back
    do{
        i--;
    lseek(fd, i, SEEK_SET);                                     //STEPPING from the start

        if (read(fd, &buffer, sizeof(buffer)) != sizeof(buffer)){   //READING
            write(STDERR_FILENO, ERR_READ, strlen(ERR_READ));
            return EXIT_FAILURE;
        }
        if(write(STDOUT_FILENO, &buffer, sizeof(buffer)) != sizeof(buffer)){    //WRITING
            write(STDERR_FILENO, ERR_WRITE, strlen(ERR_WRITE));
            return EXIT_FAILURE;
        } 
    }while (i != 0);

    buffer = '\n';
    write(STDOUT_FILENO, &buffer, sizeof(buffer));//no error-det. due to fixed value

    if(close(fd) == -1){                                //CLOSING
        write(STDERR_FILENO, ERR_CLOSE, strlen(ERR_CLOSE));
        return EXIT_FAILURE;    
    }

return EXIT_SUCCESS;

}

Не пытался запустить его, но похоже, что two_char_back должно быть -2. Чтение продвигает курсор, поэтому -1 продолжает читать то же самое.

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

Это не верно:

int two_char_back = (-1)*sizeof(char);

sizeof (char) равно 1, вам нужно -2

У вас есть опечатка в следующей строке:

int two_char_back = (-1)*sizeof(char);

Это должно быть:

int two_char_back = (-2)*sizeof(char); 

Как read() увеличивает курсор, вы на самом деле все время читаете один и тот же символ, например:

example text
           ^
           |

После прочтения:

example text
            ^
            |

После поиска:

example text
           ^
           |
Другие вопросы по тегам