0

ファイルにテキストを作成したいのですが、これが私のコードです:

int ecrire(){
    char buf[1024];
    int bytesStored;
    int fildes;
    char path[128];
    int i=0;
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
    int flags = O_WRONLY;
    printf("\n%s-->Donner l'emplacement du fichier :%s ", CYAN_NORMAL, RESETCOLOR);
    scanf("%s", path);
    fildes = open(path, flags, mode);
    if(fildes == -1){
        return 0;
    }
    printf("\n%s-->Enter le contenu pour le fichier%s ", CYAN_NORMAL, RESETCOLOR);
    printf("%s(Appuyer CTRl+D a la fin du fichier) :%s \n", CYAN_UNDERLINE  , RESETCOLOR);
    fflush(stdin);
    while((buf[i] = getc(stdin)) != EOF) i++;
    buf[i] = '\0';
    bytesStored = sizeof(buf);
    if(write(fildes,buf,bytesStored) < 0){
        return 0;
    }
    close(fildes);
    return 1;
}

たとえば、このコンテンツを書くと:

aaaaaaa 
jjjjjjjjj 
@@@@@@@

そして、私がそれを読むと、これが得られます:

aaaaaaa 
jjjjjjjjj 
@@@@@@@
P�td�=�=�=�w�wQ�td��}�Ya��E}���P�x�ڿ��ڿAa��*}�P���+}���}�x�ڿ�X�t�ڿp�ڿ���|����#a���Aa���ڿ+}�;0~�E�`��
                                                                           �
                                                                            .}�X(}��E}��#a�4C}�x�ڿ��ڿP�D�ڿ�Z���ڿ��}�`�ڿ4C}�h�ڿ�Z.}�\U�
~�x�ڿ��\U�;0~�D�ڿ\U�pS�~�E}�����#a�X(}�p�E}��A~�P�P���a�P�&gt;�}�@���}�� \�P�\r`�+}���}��-}��-}���~���~��D}������F}���h�`���@}�+}�P�I`��M`[~�;H+}�X(}�N��#a� �@{���g�P���ڿ�Z�`�ڿ��}�ڿ ��ڿ�Z�H+}�8Y�}��!�������� J{�����}��fg� J{���ڿ8Y�����I`�N���8����h�`�X(}� J{���g� J{�}�U�g��J{���}�I`��|�sLn�@{�{~g�P�8Y���%~��Z�H+}���g��J{���ڿ�i���ڿ��J{�

なぜこの問題が発生するのか、どうすれば解決できますか :

4

2 に答える 2

1
bytesStored = sizeof(buf);

bytesStored1024 に設定します。と

if(write(fildes,buf,bytesStored) < 0){

ちょうど、あなたが知っている、そのすべてを書いています。buf[]スタック上に存在するため、その内容に関する保証はなく、発見したように、1024 バイトのゴミです。

あなたはおそらく次のようなことをするつもりstrlen(buf)でした。

于 2013-10-23T14:01:11.733 に答える
1

getc は int を返し、それを char buf[i] に格納し、int 値の EOF と比較するため、まずこれは悪いことです。

(buf[i] = getc(stdin)) != EOF

必要がある

int c;
while((c = getc(stdin)) != EOF)
   buf[i] = c;

2 番目に、EOF を読み取るまで buf を埋めていますが、その後bytesStored = sizeof(buf);、完全なバッファーを設定して書き出します。これは最初は有効ですが、最後は初期化されていません。したがって、最初に有効なデータがあり、最後にゴミがあるファイルになります。設定する必要があります

bytesStored = i;

また、cou は i を削除して、bytesStored を直接変更できます。

于 2013-10-23T14:02:20.800 に答える