读取格式化文本输入

时间:2014-07-03 18:53:25

标签: c text-files

我有一个txt文件,我想从中获取输入。它看起来像这样:

1   33,3434   34,562 ...
2   24,354    55,234 ...
....

由标签分隔。每行末尾还有一个制表符和换行符。 我想在链表列表中读取逗号分隔的数字,作为整数。结构如下:

struct node
{
    int vertex;
    int dist;
    struct node* next;
};

我尝试了以下方法:

1. Using fgets and strtok:
    fgets(s,300,fp)
    while(strtok(...)!=NULL)

这会在末尾读取一个额外的东西(\ n,\ r),这会产生问题。

2. Using fscanf:
    for(i=1;i<=SIZE;i++)
    {
        fscanf(f,"%d",&i);//once per iteration
        fscanf(f,"%d,%d",&a,&b);//while it returns 2
    }

此方法仅读取一行。我无法弄清楚如何将指针移动到下一行。

3. Using fgets and sscanf:
    for(i=1;i<=SIZE;i++)
    {
        fgets(s,300,f);
        sscanf(s,"%d",&c);//once in a loop
        sscanf(s,"%d,%d",&a,&b)//while it returns 2
    }

然而,当sscanf再次被调用时,sscanf的指针不会移动。由于每行中元素的数量不同,我无法一次读取一行

1 个答案:

答案 0 :(得分:0)

第3种方法最接近,请尝试此修改。使用"%n"知道解析停止的位置。

注意:查看有关使用sscanf()

的说明
for(i=1; i<=SIZE; i++) {
  char s[300];
  if (fgets(s, sizeof s,f) == NULL) HandleEarlyEOF();

  int a,b,c;
  char *p = s;
  int n;
  if (sscanf(p, "%d%n", &c, &n) != 1) HandleMissingIndex();
  p += n;

 while (sscanf(p, "%d ,%d%n", &a, &b, &n) == 2) {
    Use(a,b,c);
    p += n;
  }   
}