atoi从文件中读取日期时表现得很好

时间:2013-09-01 18:15:47

标签: c

从昨天晚上起,我一直在努力解决这个atoi功能问题,但没有逃脱。我创建了一个程序,其中有两个函数:1-找不到。操作系统更新后的几天2-找不到。自防病毒软件更新以来的几天 经过大量的循环后,我发现了mm / dd / yy格式的两个日期,并在一个文件中写入。目前我只处理防病毒日期(我将十六进制值转换为十进制后得到)并将其存储在一个新文件中。例如,将日期设为:2013年7月17日。只有这个日期写在文件中。文件中的十六进制数据(通过十六进制研讨会打开文件后)是:

    HEX VALUE --------------------------DECIMAL VALUE
    37 2F 31 37 2F 32 30 31 33 0D 0A --- 7/17/2013..

现在我运行3个循环,以便在单独的char变量中获得7,17,2013。但是当我使用atoi,7& 17变为0但2013年仍然是2013.我完成了90%项目的剩余部分&坚持到最后一块。    文件的字符编码无法更改,因为我必须在域计算机上实现整个程序,&我找不到任何与UTF合作的方法。将个别日,​​月,年转换为整数值后,我必须找到日期的toatl值并将其与当前日期&进行比较。找到差异。所以,PLZ提供了一些解决方案。

int main(void)
{
    FILE *fp_av_dt;
    int ch_av,n=0,n1=0,n2=0,i=0,iday1=0,imon1=0,iyr1=0;
    int mon_val1=0,arr_days_values_av=0;   
    char dt_av[11],amon1[3],aday1[3],ayr1[5];

    fp_av_dt=fopen("c:\\windows\\web\\wallpaper\\av_dt.txt","r");

    while((ch_av=fgetc(fp_av_dt))!='\n')
    {
        if(isalnum(ch_av) | ch_av=='/' | ch_av=='\n')
        /* leave any other char other than '/','\n' or any digit */
        {
            dt_av[n]=ch_av;
            //printf("%c",dt_av[n]); 
            //store chars in dt_av array
            n++;
        }
    }

    printf("\n");

    for(n=0;dt_av[n]!='/';n++)       /* Loop & wait till '/' comes */
    {
        amon1[i]=dt_av[n];     /* store elements in month's array */   
        //printf("%c",amon1[i]);
        i++;     
    }

    i=0;

    for(n1=(n+1);dt_av[n1]!='/';n1++)   /*Loop & wait till next '/' comes */
    {
        aday1[i]=dt_av[n1];   store elements in day's array */
        //printf("%c",aday1[i]);
        i++;    
    }

    i=0;

    for(n2=(n1+1);dt_av[n2]!='\n';n2++)
    {
        ayr1[i]=dt_av[n2];    store elements in year's array */
        //printf("%c",ayr1[i]);
        i++;     
    }

    i=0;

    iday1=atoi(aday1);        /* convert array to integer */       
    printf("%d\n",iday1);

    imon1=atoi(amon1);                   
    printf("%d\n",imon1);  

    iyr1=atoi(ayr1);                     
    printf("%d\n",iyr1);

    system("PAUSE");
}   /* Uncomment printf lines to see the value of any variable */

这是睡前时间。因此将在10小时后上线。感谢...

4 个答案:

答案 0 :(得分:1)

尝试用

替换for循环
fscanf(fp_av_dt, "%d/%d/%d", &iday1, &imon1, &iyr1);

返回值应为3表示已读取3个值。

c.f。 scanf(3)

答案 1 :(得分:1)

它“行为不规律”的原因是因为没有任何char数组被NUL终止。改变:

i=0;

为:

amon[i] = '\0'; i = 0;

等应该修复它,尽管你仍然没有任何边界检查。

答案 2 :(得分:1)

通常保持简单是更好的,所以为什么不先读行

char buffer[16];
fgets( buffer, 16, fp );

然后使用

提取内容
int month = 0, day = 0, year = 0;
int args = sscanf( buffer, "%d/%d/%d", &month, &day, &year );
if ( args != 3 ) 
{
  fprintf(stderr, "wrong format\n" );
}

答案 3 :(得分:0)

感谢您提供解决方案并给我一些scanf命令。我找到了出路。这很奇怪但很有效。 当我在完成赋值后将每个char变量的值转换为整数时,它会给出正确的值。到目前为止,我正在将所有变量全部转换(atoi)(即,在所有数组中存储元素之后)。解决方案例如:

    for(n=0;dt_av[n]!='/';n++)     /* wait till '/' comes */
    {
        amon1[i]=dt_av[n]; //assign 7 to amon (month) variable                    
        i++;     
    }  
    amon1[i+1]='\0'; /* didn't actually make any difference, but still it should be kepy */
    i=0;   imon1=atoi(amon1);
    printf("%d\n",imon1);

我无法理解为什么会发生这种情况。过去24小时让我保持旋转状态。无论如何,感谢所有人。