如何使用scanf和fscanf读取一行文本并将其解析为变量?

4

我想读取一个文本文件,每行都有以下格式:

char*,char*,int

例如:

aaaaa,dfdsd,23

bbbasdaa,ddd,100

我想使用fscanf从文件中读取一行,并自动将该行解析为变量string1、string2和intA。

正确的做法是什么呢?谢谢。


格式应该是 字符串,字符串,整数:这些行实际上并不包含内存地址,对吧? - Fred Foo
不,我的错。就像你说的那样。 - RanH
2个回答

7
假设您已经具备以下条件:
char string1[20];
char string1[20];
int intA;

你可以这样做:
fscanf(file, "%19[^,],%19[^,],%d\n", string1, string2, &intA);

%[^,] 读取非逗号字符的字符串,并在遇到第一个逗号时停止。 19 是最多可读取的字符数(假设缓冲区大小为20),以防止缓冲区溢出。


1
如果我不知道字符串的最大长度怎么办?我必须无论如何定义一些最大长度吗? - RanH
2
是的。欢迎来到 C 风格字符串操作的乐趣。 “正确”的答案是使用类似于 C++ 的 std::string。 “懒惰”的答案是永远流行的 char foo[1000]。 - ChrisV

0
如果您无法对一行的长度做出任何安全的假设,那么您应该使用getline()函数。该函数需要三个参数:一个指向字符串的指针(char**),一个指向保存该字符串大小的int指针和一个文件指针,并返回读取的行的长度。getline()动态分配字符串的空间(使用malloc / realloc),因此您不需要知道行的长度,也没有缓冲区溢出的问题。当然,它不像fscanf那样方便,因为您需要手动拆分行。
例如:
char **line=NULL;
int n=0,len;
FILE *f=fopen("...","r");

if((len=getline(&line,&n,f)>0)
{
...
}

free(line);
fclose(f);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接