2016-12-06 70 views
0

这是我的“电话簿”程序的一部分。用文件io打印整行

void viewall(){ 
    int n, checking = 0; 
    char name[50]; 

    fp = fopen("Phonebook.txt","r"); 
    printf ("\n\n"); 

    fscanf (fp, "%s %d", name, &n); 
    while (!feof(fp)){ 
     printf (" %s +880%d\n", name, n); 
     fscanf (fp, "%s %d", name, &n); 
     ++checking; 
    } 

    if (checking == 0){ 
     printf (" Contact List is Empty. No Contacts to Show..."); 
    } 

    printf ("\n\n"); 
    fclose(fp); 

    menu(); 
} 

此部分显示列表中的所有联系人。但是,如果任何联系人名称有两个部分,他们会分开。例如:我输入Anik Shahriar作为姓名,然后输入我的电话号码。我看着我的文件,这个数据在那里应该如何。

Anik Shahriar 01*******93 

但是当我想显示所有的联系人。它得到了印像这样:

Anik 0 
Shahriar 01*******93 

我怎样才能使程序打印整个行?

+0

当你说'fscanf(fp,“%s%d”,name,&n)'你正在编程时发现'Anik'这是一个字符串,然后看到一个空格并寻找一个数字并且找不到它(“Shahriar”是一个字符串),所以它把'0'放在'n'中。 __然后___找到“Shahriar”和电话号码,该部分正确。总之,除非你有名字和姓氏的变量,否则你不能用空格来分隔名和姓。 – Jerfov2

+0

它工作@ user3121023但另一个问题。这次名称打印在同一行,但联系号码打印在下一行。 –

+0

它没有之前。他们在同一条线上。在使用fgets之后,他们分开排队。我如何终止fgets中的'\ n'? –

回答

1

此行为是由线

fscanf (fp, "%s %d", name, &n); 

格式标识符%S为单串的扫描引起。任何空格字符结束扫描。

http://www.cplusplus.com/reference/cstdio/scanf/

%S
字符串字符
任何数量的非空白字符, 停在找到的第一个空白字符的。在存储的序列末尾自动添加终止空字符 。

我建议使用ca CSV文件并使用类似的格式字符串。

scanf("%[^,] %d", name, number) 

不要忘记测试scanf结果值。

+0

因为我是一个讨厌的人 - 看起来很有趣,你链接到一个'C++'网站来回答'c'问题;) – KevinDTimm