我有一个使用fscanf
函数阅读的输入文本。我可以看几行。但是,我看不懂一行。你能帮忙吗?
我的input.txt:
54,Zeynep Kucuk,62-46-59
62,Osman Buyuk
46,Gulay Er,25-23-32-1
我可以阅读第一行和第三行。但是第二行有些问题,因为第二行的第三位是空的。
但是我可以确定输入是否如下
54,Zeynep Kucuk,62-46-59
62,Osman Buyuk,0
46,Gulay Er,25-23-32-1
0表示Osman Buyuk没有朋友。
下面我的代码的一部分
int id;
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fscanf(dosya, "%d,%[^,],%s,%[^,],%s\n", &id, name, friends) == 3) {
root = insertNewUser(root, id, name, friends);
}
将我的数据添加到树中并打印后,预期输出为:
31,NAME1 SURNAME1,16-23-45-3
21,NAME2 SURNAME2
10,NAME3 SURNAME3,12-31-1-5
答案 0 :(得分:0)
要跳过该行的第二和第四项,必须在*
之前传递分配抑制字符[
:
fscanf(dosya, "%d,%*[^,],%s,%*[^,],%s\n", &id, name, friends)
还请注意,%s
将在空格处停止:您可能想将%[^,]
使用name
,将%[^\n]
使用friend
,并且不应阅读带有\n
的尾随换行符,它将读取任何未决的空格,但改为%*1[\n]
或%c
来读取尾随字节。强烈建议传递最大字符数以存储到目标数组中,以防止无效输入时出现未定义的行为。
最后,如果需要处理缺少部分的行,最好使用fgets()
一次读取文件一行,并使用sscanf()
解析数组。
这是您的代码片段的修改版本:
int id;
char buf[1024];
char name[100];
char friends[100];
FILE *dosya = fopen("input.txt", "r");
struct node *root = NULL;
while (fgets(buf, sizeof buf, dosya)) {
*friends = '\0';
int n = fscanf(dosya, "%d,%*[^,],%99[^,],%*[^,],%99[^\n]", &id, name, friends);
if (n >= 2)
root = insertNewUser(root, id, name, friends);
}