2013-10-23 23 views
0

寫功能我想創建文本INT文件,這是我的代碼:問題在C

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�>�}�@���}�� \�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{� 

爲什麼我得到這個問題,我怎麼能解決這個問題:

+1

我聞到一個缺失的''\ 0''終止符。 – Kninnug

回答

1
bytesStored = sizeof(buf); 

sets bytesStored to 1024;和

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

只是寫,你知道,所有這一切。由於buf[]存在於堆棧中,因此無法保證其內容,正如您發現的那樣,這是1024字節的垃圾。

你可能打算做點像strlen(buf)

1

首先,這是不好的,因爲getc返回一個int,然後將它存儲在char buf [i]中,然後將其與int值EOF進行比較。

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

您需要

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

其次,您要填寫BUF,直到你讀EOF,但你要設置bytesStored = sizeof(buf);等寫出完整的緩衝 - 這是在開始,但初始化有效最後。所以你最終會得到一個有效數據的文件,最後是垃圾。您需要設置

bytesStored = i; 

此外,cou可以消除我並直接修改bytesStored。