6

これは宿題の一部です。さて、私は宿題で物事を動かすことができなかったので、スニペットを取り出して、何が悪いのかを理解するためにそれをいじり始めました。

CのLinuxで、テキストファイルを開く/作成し、それに何かを書き込んで閉じ、読み取り/書き込みおよび追加モードで開き、最後に何かを追加しようとしています(この例では、文字列"、 お前")。ただし、何も追加されていませんが、書き込みメソッドもエラーをスローしていません。どうしたのかわからない。

コードは次のとおりです。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

#define BUFFSIZE 4096

int main(){
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

    int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode);

    char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};

    size_t n = sizeof(buf);
    if(write (fd, buf, n) < 0){
        printf("Error in write\n");
        printf("%s", strerror(errno));
        return 1;
    }

    close(fd);

    int fd2 = open("tempfile.txt", O_RDWR | O_APPEND);

    printf("appending dude:\n");
    char buf2[6] = {',', ' ', 'd', 'u', 'd', 'e'};
    size_t p = sizeof(buf2);
    if(write (fd2, buf2, p) < 0){
        printf("Error in write\n");
        printf("%s", strerror(errno));
        return 1;
    }

    char buf3[BUFFSIZE];
    lseek(fd2, 0, SEEK_SET);
    if(read (fd2, buf3, BUFFSIZE) < 0){
        printf("Error in read\n");
        printf("%s", strerror(errno));
        return 2;
    }
    int i;
    for (i = 0; i < strlen(buf3); ++i){
        printf("%c", buf3[i]);
    }
    printf("\n");

    close(fd2);

    return 0;
}

モード変数を S_IRWXU | S_IRWXG | S_IRWXO、2 番目の open ステートメントで 3 番目の引数としてモードを渡す、2 番目の open ステートメントで追加モードでファイルを開くだけ、2 番目の open ステートメントで 3 番目の引数として追加モードを渡す、など。

私ができる最善の方法は、APPEND モードを使用せずに RDWR で開き、既存のテキストに直接上書きすることですが、それは私が望んでいることではありません。また、lseek のようなことは承知していますが、ここでの目的は厳密には追加モードを使用してファイルの末尾にテキストを追加することです。私はlseekしたくありません。

これを見て何か手がかりはありますか?私が理解していない明らかな何かがあると確信しています。

どうもありがとう。

4

4 に答える 4

4

さて、私はちょうどあなたのプログラムを試してみて、何がうまくいかないのか考えています.

基本的には動作しますが、不具合があります。最初に「あなたの秋」をファイルに書き込むときは、バイトchar配列を使用し、配列4096全体をファイルに書き込みます。つまり、「あなたの秋」の後4088にランダムな文字が続くことを意味します。後で追加すると、4097 番目以降の位置に追加されます。これはおそらく意図したものではありません。

作成したファイルを単にcat表示すると、予想される出力「thy fall, dude」が表示されます。4096しかし、コード全体を読むと、文字しか読んでいません。したがって、「、おい」の部分は決して読み取られないため、プログラムはそれを出力しません。

私の解決策は、配列のサイズを変更する必要があることです。そして、読むときは、EOFに達するまで、たとえば100または1000のチャンクで読み込みます(read-1が返されます)。

于 2013-10-03T05:10:26.650 に答える
2

ちょっとした間違いがあります。関数は配列のサイズを返しますが、関数は配列に格納されている文字列の長さを返すだけなので、sizeof関数をに変更する必要があります!strlensizeofstrlen

于 2013-10-03T06:01:14.683 に答える