Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从fscanf获取格式化文本_C_File_Date_Logging_Scanf - Fatal编程技术网

从fscanf获取格式化文本

从fscanf获取格式化文本,c,file,date,logging,scanf,C,File,Date,Logging,Scanf,我是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,

我是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);
FILE*log\u FILE=fopen(“/Users/williambertarello/Desktop/Test/Test/log.txt”,“r+”);
if(log_file==NULL){
printf(“\n没有选定的文件\n”);
}否则{
对于(int i=0;i<总登录尝试次数(日志文件);i+=1){
整年=0;
整月=0;
整日=0;
整小时=0;
int分钟=0;
int秒=0;
字符用户名[10];
字符状态;
int ret=fscanf(日志文件,“%d-%d-%d%d:%d:%d%s%c”、&year、&month、&day、&hour、&minute、&second、用户名和状态);
如果(ret==2){
尝试次数[i]。年=年;
尝试次数[i]。月=月;
尝试次数[i]。天=天;
尝试次数[i]。小时=小时;
尝试次数[i]。分钟=分钟;
尝试[i]。秒=秒;
尝试[i]。状态=状态;
}
}
}
fclose(日志文件);
此程序的目的应该是揭示服务器中无人值守重复登录失败的潜在安全风险

编辑: 关于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
}
for(int i=0;i{
日期:1265508352
月份:32767
年份:-256879960
小时:32767
会议记录:1512161226
秒:0
}

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

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

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