【问题标题】:How to use scanf \ fscanf to read a line and parse into variables?如何使用 scanf\fscanf 读取一行并解析成变量?
【发布时间】:2011-07-09 10:39:55
【问题描述】:

我正在尝试在每一行中读取使用以下格式构建的文本文件:

char*,char*,int

即:

aaaaa,dfdsd,23

bbbasdaa,ddd,100

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

正确的做法是什么? 谢谢

【问题讨论】:

  • 格式为string, string, int:这些行实际上并不包含内存地址,是吗?
  • 不,我的错。就像你说的那样

标签: c file file-io scanf


【解决方案1】:

假设你有:

char string1[20];
char string1[20];
int intA;

你可以这样做:

fscanf(file, "%19[^,],%19[^,],%d\n", string1, string2, &intA);

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

【讨论】:

  • 如果我不知道字符串的(最大)长度怎么办?无论如何,我必须定义一些最大长度吗?
  • 是的。欢迎来到 C 风格字符串操作的乐趣。 “正确”的答案是使用类似于 C++ 的 std::string 的东西。 “懒惰”的答案是流行的 char foo[1000]。
【解决方案2】:

如果你真的不能对行的长度做出任何安全的假设,你应该使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多