我认为你的模式中需要一个闭合的\n
。 我看到一堆滚动文本,第一行相同,使用%[^\n]
,但是使用%[^\n]\n
,我看到了预期的输出。
然而,如果文件中的行超过缓冲区的大小,你可能会遇到一个问题,即你的缓冲区没有足够的空间。结果可能会出现截断。
测试版本1:
代码
#include <stdio.h>
int main(int argc, char * argv[])
{
FILE * database;
char buffer[30];
database = fopen("test.txt", "r");
if (NULL == database)
{
perror("opening database");
return (-1);
}
while (EOF != fscanf(database, "%[^\n]\n", buffer))
{
printf("> %s\n", buffer);
}
fclose(database);
return (0);
}
结果
> 12343456567856789
> zbasdflkjasdfkjklsdafjklas
> zxcvjkleryjkldhfg
> 1234567890123456789012341234
> 12345678901234567890123123asdfjklzxcv
*** stack smashing detected ***: ./fscanf terminated
Segmentation fault (core dumped)
测试v2:
让我们修复代码以避免溢出缓冲区。这可以通过将%[^\n]\n
更改为%30[^\n]\n
来实现。这告诉 fscanf 它只能使用缓冲区的大小 - 30。
代码
#include <stdio.h>
int main(int argc, char * argv[])
{
FILE * database;
char buffer[30];
database = fopen("test.txt", "r");
if (NULL == database)
{
perror("opening database");
return (-1);
}
while (EOF != fscanf(database, "%30[^\n]\n", buffer))
{
printf("> %s\n", buffer);
}
fclose(database);
return (0);
}
结果
看起来它运行成功了!
> 12343456567856789
> zbasdflkjasdfkjklsdafjklas
> zxcvjkleryjkldhfg
> 1234567890123456789012341234
> 12345678901234567890123123asdf
> jklzxcv
> qrt41234
test.txt
这就是我使用的测试文件的样子。
12343456567856789
zbasdflkjasdfkjklsdafjklas
zxcvjkleryjkldhfg
1234567890123456789012341234
12345678901234567890123123asdfjklzxcv
你为什么使用 fscanf
而不是 fgets
?
如果你使用 fgets
,需要注意的一点是你可能需要去除字符串中的 \n
字符,因为它会作为字符串的一部分被包含进去。
从 cplusplus.com 的描述来看,fgets
的功能是:
从流中读取字符并将它们存储为 C 字符串到 str 中,直到读取了 (num-1) 个字符或者遇到换行符或文件结尾为止,以先到者为准。
示例:
#include <stdio.h>
int main()
{
FILE * database;
int res;
char buffer [100];
database = fopen(fileName,"r");
if (NULL == database) {
perror("opening database file");
return (-1);
}
while (!feof(database)) {
if (buffer != fgets(buffer, 100, database))
break;
int len = strlen(buffer);
if (buffer[len - 1] == '\n')
buffer[len - 1] = 0;
printf("ATTEMPT TO: Insert user %s\n\n", buffer);
if (insert_Customer(clients, create_Customer(buffer)) < 0)
printf("\nERROR: Failed to insert and create customer %s\n", buffer);
else
printf("\nSUCCESS: Inserted Customer %s\n\n", buffer);
}
fclose(database);
return (0);
}