我會在閱讀字符時總是檢查FILE *。
我認爲這是一種風格的東西,但我不會把我通常打算髮生在循環內的東西。
最後,成功讀取的字符串應始終以'\ 0'結尾。當出現錯誤時,我經常會對做什麼事情感到厭倦。如果我知道功能是什麼,我通常可以選擇。
因此,使用你的文件檢查的風格:
void speek(char *peek, size_t len, FILE *stream) {
int i;
for (i = 0; i < len-1 && !feof(stream); i++) {
peek[i] = fgetc(stream);
}
peek[i] = '\0';
for (i = strlen(peek)-1; i >= 0; i--) {
if (ungetc(peek[i], stream) != peek[i]) {
break; // I'd return an error, but function is void
}
}
}
如果這不是一個快速的實驗多,還是我在寫這個的人,我可能會使用斷言檢查參數(是的,我知道,我還是做了(C = GETC(...)),我老了)
#include <assert.h>
int speek(char *peek, size_t len, FILE *stream) {
assert(peek != NULL);
assert(len > 0); /* Could 0 be okay? */
assert(stream != NULL && !ferror(stream));
int i;
int c;
for (i = 0; i < len-1 && (c=getc(stream)) != EOF; i++) {
peek[i] = c;
}
peek[i] = '\0';
if (ferror(stream)) return -1;
for (int j = i-1; j >= 0; j--) {
if (ungetc(peek[j], stream) != peek[j]) {
return -1;
}
}
return i; /* I like to return something useful */
}
編輯:我試過鏡原來的,但它不是我做的方式,所以最後放棄了,寫下了我通常想寫的東西。
編輯2:...但我犯了一個錯誤。正確的方法是在之前檢查字符是否有空間。衛生署!
簡單的測試程序:
int main (int argc, const char * argv[]) {
char line0[100];
int n0 = speek(line0, 4, stdin);
fprintf(stderr, "%d '%s'\n", n0, line0);
char line1[100];
int n1 = speek(line1, 8, stdin);
fprintf(stderr, "%d '%s'\n", n1, line1);
return 0;
}
僅給出abcefghij
包含文件提供
3 'abc'
7 'abcdefg'
這是* C的*困難的部分:你必須提前決定你如何去檢查並報告錯誤,並且您既沒有例外,也沒有堆棧展開。對於無法從中恢復的I/O故障,我建議使用錯誤消息明確停止該程序。對於本身的問題,每個I/O函數都可能隨時失敗(例如,假設文件在USB密鑰上,並且在程序運行時將其刪除),因此應該檢查每個*函數是否正確執行。 – 2012-03-29 20:02:00