假設你正在處理一些其他的分隔符,如\t
標籤,而不是\n
換行符。
的更一般方法的分隔符是使用getc()
,其抓住一次一個字符。
注意getc()
返回int
,這樣我們就可以測試與EOF
平等。
其次,我們定義char
類型的數組line[BUFFER_MAX_LENGTH]
,爲了存儲多達在堆棧上BUFFER_MAX_LENGTH-1
字符(我們有保存用於\0
終止字符的最後一個字符)。
使用數組可避免使用malloc
和free
在堆上創建正確長度的字符指針。
#define BUFFER_MAX_LENGTH 1024
int main(int argc, char* argv[])
{
FILE *file = NULL;
char line[BUFFER_MAX_LENGTH];
int tempChar;
unsigned int tempCharIdx = 0U;
if (argc == 2)
file = fopen(argv[1], "r");
else {
fprintf(stderr, "error: wrong number of arguments\n"
"usage: %s textfile\n", argv[0]);
return EXIT_FAILURE;
}
if (!file) {
fprintf(stderr, "error: could not open textfile: %s\n", argv[1]);
return EXIT_FAILURE;
}
/* get a character from the file pointer */
while(tempChar = fgetc(file))
{
/* avoid buffer overflow error */
if (tempCharIdx == BUFFER_MAX_LENGTH) {
fprintf(stderr, "error: line is too long. increase BUFFER_MAX_LENGTH.\n");
return EXIT_FAILURE;
}
/* test character value */
if (tempChar == EOF) {
line[tempCharIdx] = '\0';
fprintf(stdout, "%s\n", line);
break;
}
else if (tempChar == '\n') {
line[tempCharIdx] = '\0';
tempCharIdx = 0U;
fprintf(stdout, "%s\n", line);
continue;
}
else
line[tempCharIdx++] = (char)tempChar;
}
return EXIT_SUCCESS;
}
如果你必須使用一個char *
,那麼你仍然可以使用此代碼,但你strdup()
的line[]
陣列,一旦其與線的價值輸入的灌滿。你必須free
此複製串一旦你用它做,否則你會得到一個內存泄漏:
#define BUFFER_MAX_LENGTH 1024
int main(int argc, char* argv[])
{
FILE *file = NULL;
char line[BUFFER_MAX_LENGTH];
int tempChar;
unsigned int tempCharIdx = 0U;
char *dynamicLine = NULL;
if (argc == 2)
file = fopen(argv[1], "r");
else {
fprintf(stderr, "error: wrong number of arguments\n"
"usage: %s textfile\n", argv[0]);
return EXIT_FAILURE;
}
if (!file) {
fprintf(stderr, "error: could not open textfile: %s\n", argv[1]);
return EXIT_FAILURE;
}
while(tempChar = fgetc(file))
{
/* avoid buffer overflow error */
if (tempCharIdx == BUFFER_MAX_LENGTH) {
fprintf(stderr, "error: line is too long. increase BUFFER_MAX_LENGTH.\n");
return EXIT_FAILURE;
}
/* test character value */
if (tempChar == EOF) {
line[tempCharIdx] = '\0';
dynamicLine = strdup(line);
fprintf(stdout, "%s\n", dynamicLine);
free(dynamicLine);
dynamicLine = NULL;
break;
}
else if (tempChar == '\n') {
line[tempCharIdx] = '\0';
tempCharIdx = 0U;
dynamicLine = strdup(line);
fprintf(stdout, "%s\n", dynamicLine);
free(dynamicLine);
dynamicLine = NULL;
continue;
}
else
line[tempCharIdx++] = (char)tempChar;
}
return EXIT_SUCCESS;
}
此代碼甚至不應該編譯。 '的sscanf(行,文件名, 「%S」);'應該是'的sscanf(線,文件 「%s」);' – Mawg 2016-08-10 14:50:18
注意['雖然'永遠是錯的(FEOF(文件)!)](HTTP ://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong)。 – 2017-05-08 21:17:11
的可能的複製[C逐行讀取文件中的行(https://stackoverflow.com/questions/3501338/c-read-file-line-by-line) – 2017-11-24 16:37:55