我有一个用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
要跳过行中的第二个和第四个项目,必须在*
之前传递赋值抑制字符[
:
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);
}