你或多或少正確。我對這個代碼
char *myCString = malloc(sizeof(char)*(STRLEN+1))
該筆記確實分配的STRLEN + 1個字節的緩衝(如果的sizeof(char)的是一個字節)。 STRLEN應該是您希望讀取的最大字節數。編譯器可能會抱怨,因爲malloc返回一個void *類型,並且將它存儲在char *中。向malloc調用添加(char *)類型轉換。
read(fd, buff, STRLEN+1);
這將從文件句柄fd中讀取最大(STRLEN + 1)字節到名爲'buff'的緩衝區中。除了你已經調用緩衝區'myCString'的事實,這是好的。但是,此讀取不會在從文件讀取的字符末尾添加'\ 0',並且它不會在行尾停止。
如果您正在嘗試讀取和寫入行,那麼我建議您閱讀關於fopen/fclose/fprintf/fputs/fscanf/fgets的信息。這些是用於將字符串IO執行到文件的傳統C庫函數。
write(fd, buff, STRLEN+1);
這會將(STRLEN + 1)字節寫入文件,而不管字符串長度在緩衝區中。例如,假設STRLEN = 7(所以你有一個8字符的緩衝區)。假設你在緩衝區中有'HELLO'這個詞。
存儲器將是:
0 1 2 3 4 5 6 7
H E L L O \0 ?? ??
的??表示這個內存可能有任何值。
如果我'寫(fd,buf,8)',那麼它會將全部8個字節寫入文件。該文件將結束:
H E L L O \0 ?? ??
我希望你寧願有5個字節的文件(HELLO)
由於讀一個例子,假設你有2條線中有一個文件,用unix文件結尾。它可能看起來像:
H E L L O \n W O R L D \n
(其中\ n =新行字符)
注意到有文件中沒有\ 0字符。 \ 0作爲緩衝區終結符是一個C事物,並且在文件中沒有模擬。
如果我沒有「讀(FD,BUF,8),那麼我的緩衝器將結束:
H E L L O \n W O
8個字符被讀取,並且該字符串沒有 '\ 0' 就結束。如果我試圖打印它,那麼我會失敗,因爲沒有\ 0。
正確的函數是fgets和fputs,它們會讀取和寫入字符串,並考慮到\ n。
'\ 0'被稱爲NULL結束符,它表示字符串的結尾。 –
答案或多或少是「是」。但是在這裏我們不知道什麼是'STRLEN'。它也取決於你的文件的格式。這個問題太廣泛了。 –
是的,沒錯,以'C'結尾的字符數組被稱爲C中的字符串。此外,'sizeof(char)'總是1,所以這是毫無意義的。 'myCString'和'buff'不一樣,但也許這兩個不應該是相關的。 – unwind