如何从txt文件中读取制表符分隔的字符串并将它们放入变量中?

Fer*_*dow 2 c file

我有一个文件,我正在尝试阅读和填充变量.该文件包含:

0\ttake a nap\n
1\tstudy heap-based priority queue\n
101\treview trees for Midterm 2\n
3\tdo assignment 7\n
Run Code Online (Sandbox Code Playgroud)

这可能很难阅读,但你可以看到有一个整数开头,后跟一个标签,一个字符串,然后是换行符.我需要取整数并将其放入变量,检测选项卡,并将选项卡后面的字符串放入变量,检测换行符,获取两个变量并创建包含该信息的节点,然后重新开始下一行.经过几个小时的互联网搜索,这就是我想出来的:

char activity[SIZE];
 char position[SIZE];
 char line[100];

  FILE *infile;
  char *inname = "todo.txt";

  int i = 0;


  infile = fopen(inname, "r");
  if (!infile) {
    printf("Couldn't open %s for reading\n");
    return 0;
  }
while(i < 100 && fgets(line, sizeof(line), infile) != NULL){
        sscanf(line, "%s\t%s", position, activity);
        printf("%s\n", position);
        printf("%s\n", activity);
        i++;
    }
Run Code Online (Sandbox Code Playgroud)

在上面的txt文件上运行此测试代码时,我得到了这个结果:

0
take
1
study
101
review
3
do
Run Code Online (Sandbox Code Playgroud)

所以,它看起来像是让第一个数字正常(作为一个字符串)并将其放入变量,看到标签,并抓住标签后的第一个序列,并在将其放入另一个变量后停在那里.我该如何纠正这种情况?

cni*_*tar 5

您可以尝试更改sscanf:

sscanf(line, "%s\t%[^\n]", position, activity);
Run Code Online (Sandbox Code Playgroud)

%s当它遇到空格符停止.这就是为什么它只读取研究而不是研究基于堆的优先级队列.该%[^\n]告诉它:"看,直到换行".另一个问题:您应该测试返回的值,sscanf以确保它填充了所需数量的对象.


您还可以将第一个整数读作整数,更改positionint和使用%d而不是%s.

编辑

为了使自己清楚,我的建议是:

int position;
sscanf(line, "%d\t%[^\n]", &position, activity);
Run Code Online (Sandbox Code Playgroud)