我有一个文件,我正在尝试阅读和填充变量.该文件包含:
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)
所以,它看起来像是让第一个数字正常(作为一个字符串)并将其放入变量,看到标签,并抓住标签后的第一个序列,并在将其放入另一个变量后停在那里.我该如何纠正这种情况?
您可以尝试更改sscanf:
sscanf(line, "%s\t%[^\n]", position, activity);
Run Code Online (Sandbox Code Playgroud)
在%s当它遇到空格符停止.这就是为什么它只读取研究而不是研究基于堆的优先级队列.该%[^\n]告诉它:"看,直到换行".另一个问题:您应该测试返回的值,sscanf以确保它填充了所需数量的对象.
您还可以将第一个整数读作整数,更改position为int和使用%d而不是%s.
为了使自己清楚,我的建议是:
int position;
sscanf(line, "%d\t%[^\n]", &position, activity);
Run Code Online (Sandbox Code Playgroud)