C-从文本文件下面打印行和行

时间:2015-08-20 09:34:36

标签: c

我有一个这样的文本文件:

  

姓名:Vincent

     

年龄:21

     

姓名:赫尔曼

     

年龄:22

     

姓名:亨德里克

     

年龄:42

程序会询问名称,并且必须使用此人的年龄打印txt文件中的名称。我只能打印名称,但不能打印年龄。

这是我的计划:

#include<stdio.h>
#include<string.h>

int main(void)
{
    FILE *bestand;
    char pers[32];
    char tekens[500];

    bestand = fopen("Bestand.txt", "r");

    printf("Van welke persoon wilt u de leeftijd weten?");
    gets(pers);

    while (fgets(tekens,500, bestand)!=NULL)
    {
        if (strstr(tekens, pers) != NULL)                  
        {
            printf(tekens);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我建议您阅读有关结构,数组以及如何将字符串拆分为标记的信息(strtok可能对此有所帮助。)

然后为了解决您的问题,我建议您首先将文件的数据读入结构数组。之后要求用户输入名称,并在数组中搜索正确的结构,然后从结构中打印名称和年龄。

此外,您需要找出一些与案例无关的字符串比较的方法,例如,如果文件中的名称为Hendrik,但用户输入hendrik

答案 1 :(得分:0)

每条记录为2行,因此每个循环读取2行。

有很多方法可以解析每一行。 sscanf()在此处使用。

char pers[32+1];
char teken1[500];
char teken2[500];

fgets(pers, sizeof pers, stdin);
pers[strcspn(pers, "\n")] = '\0'; // Get rid of potential trailing \n
...
while (fgets(teken1, sizeof teken1, bestand)  && fgets(teken2, sizeof teken2, bestand)) {
  char name[32];
  unsigned age;
  if (1 != sscanf(teken1, "Name: %31s", name)) break;  // invalid name
  if (1 != sscanf(teken2, "Age: %u", &age)) break;      // invalid age
  if (strcmp(pers, name) == 0) {
    printf("%s %u\n", name, age);
  }
}

强烈建议不要printf(tekens);。如果文件包含'%'的行,则printf(tekens);将尝试引用不存在的参数。最好使用fputs(tekens, stdout);

@Raghu所述,请勿使用gets()。它对用户输入没有限制,并且不是C11编译器的标准。

附加代码可以查找1)线路上的额外垃圾,2)合理的名称内容(所有字母或“ - ”)3)合理年龄4)名称空格5)不区分大小写