1

C-レクチャーのスキル練習で問題があります。私の演習は、テキストドキュメント(プログラムと同じディレクトリにあります)を1文字ずつ読み取り、ターミナルで逆に(つまり、最後から最初まで、1文字ずつ)書き込むことです(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

4 に答える 4

1

実行してみたことはありませんが、two_char_back は -2 のようです。読み取りはカーソルを進めるので、-1 は同じものを読み取り続けます。

また、オプションとして、ファイル全体を読み込んでから反転させてから書き込むことで、より効率的にすることができます。

于 2013-10-27T09:29:56.657 に答える
1

次の行にタイプミスがあります。

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

それは違いない:

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

カーソルをインクリメントするとread()、実際には常に同じ文字を読んでいます。

example text
           ^
           |

読んだあと:

example text
            ^
            |

シーク後:

example text
           ^
           |
于 2013-10-27T09:34:55.500 に答える
1

これは間違っています:

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

sizeof(char) は 1 です。-2 が必要です

于 2013-10-27T09:27:43.547 に答える