我需要正确阅读一行的结尾。空白区域问题

时间:2019-04-21 19:47:05

标签: c scanf

我有一个使用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

1 个答案:

答案 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);
}