【问题标题】:Acquire formatted text from fscanf从 fscanf 获取格式化文本
【发布时间】:2018-01-18 21:34:24
【问题描述】:

我是 C 新手,我需要从文本文件中获取特定信息。文本文件格式为:

2015-01-01 12:00:01 rossi S
2015-01-02 12:00:01 bianchi F
2015-01-02 12:00:20 bianchi F
2015-01-03 00:00:01 rossi S
2015-01-03 11:12:20 verdi F

这是结构声明

struct login_attempt{
        int day, month, year, hour, minute, second;
        char username[10];
        char status;
    }; struct login_attempt attempts[256];

这是不起作用的代码:

FILE *log_file = fopen("/Users/williambertarello/Desktop/Test/Test/log.txt", "r+");
    if(log_file == NULL){
        printf("\n No selected file \n");
    }else{
        for(int i = 0; i < total_login_attempts(log_file); i += 1){
            int year =0;
            int month = 0;
            int day = 0;
            int hour = 0;
            int minute = 0;
            int second = 0;
            char username[10];
            char status;

            int ret = fscanf(log_file, "%d-%d-%d %d:%d:%d %s %c", &year, &month, &day, &hour, &minute, &second, username, &status);
            if(ret == 2){
                attempts[i].year = year;
                attempts[i].month = month;
                attempts[i].day = day;
                attempts[i].hour = hour;
                attempts[i].minute = minute;
                attempts[i].second = second;
                attempts[i].status = status;
            }
        }
    }
    fclose(log_file);

该程序的目的应该是揭示服务器中无人看管的重复登录失败的潜在安全风险。

编辑: 在对不正确的 if(ret==2) 提出了一些建议之后,我尝试了这个,但它也不起作用,因为调试的变量值是:

for(int i = 0; i < total; i += 1){
            int ret = fscanf(log_file, "%d-%d-%d %d:%d:%d %s %c", &attempts[i].year, &attempts[i].month, &attempts[i].day, &attempts[i].hour, &attempts[i].minute, &attempts[i].second, attempts[i].username, &attempts[i].status);
        }

Login attempt 0 -> {
  day: 1265508352
  month: 32767
  year: -256879960
  hour: 32767
  minute: 1512161226
  second: 0
}

【问题讨论】:

  • fscanf 返回匹配令牌的数量,在您的情况下,成功扫描将匹配 8 个,而不是 2 个。
  • 为什么代码在if(ret == 2)中使用2

标签: c file date logging scanf


【解决方案1】:

为什么要检查fscanf aginst 2 的返回值?您正在读取两个以上的参数,并且您希望得到8 成功的分配?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多