fscanf - strcmp - 来自文件 - 相应id的打印名称

时间:2017-06-21 05:27:16

标签: c

警告:代码完全无效。可能有很多错误。

意图:打印数据库中的ID名称: file.txt

file.txt(id,name)

1 ooo
2 eee
3 zzz

test.c :(只是草图。不起作用)。

虽然下面的脚本不起作用。我的意图是让它按原样运作。而不是使用其他一些方法。因为我有一种感觉,这将是一个非常合理的方法,只需很少的代码。在下面的示例中,我尝试获取 id 3

的名称
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{

    FILE *fff;
    fff = fopen("/file.txt","r");
    char *name;

    int r, line = 0, found = 0;
    float id;

    r = fscanf(fff, "%f %s\n", &id, name);

    while (r != EOF){
        line++;

        if(strcmp("3", id) == 0){
            printf("%s",name);
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码有多个问题:

  • 您应该使用本地数组来读取字符串而不是未初始化的指针。
  • 您应该使用int类型id,因为它们似乎是一个范围相当小的整数。
  • 您应该检查fopen()是否成功打开文件。
  • 您应该将最大数量的字符存储到name数组中以避免潜在的缓冲区溢出。
  • fscanf()成功的正确检查是将其返回值与预期转化次数进行比较。
  • 您应该将数字与==运算符进行比较,strcmp代表C字符串。
  • 您应该关闭该文件。
  • 您应该将main()定义为返回int并在成功操作后返回0
  • 使用fscanf()跟踪行号是不可能的:此函数会无差别地处理换行符和空格,并在数字和字符串之前忽略它。
  • 如果要在找到匹配项时停止,请使用break声明。

以下是修改后的版本:

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

int main(void) {
    char name[100];    
    FILE *fff;
    int found = 0;
    int id;

    fff = fopen("/file.txt", "r");
    if (fff == NULL) {
        fprintf(stderr, "cannot open input file /file.txt: %s\n",
                strerror(errno));
        return 1;
    }
    while (fscanf(fff, "%d %99s", &id, name) == 2) {
        if (id == 3) {
            printf("%s\n", name);
            found = 1;
            break;
        }
    }
    /* you could do something with the found indicator */
    //if (found == 0) printf("no match for id == 3\n");

    fclose(fff);

    return 0;
}