每秒写入一个当前时间,并且在每一行加上行号。我有时候会出现行号重叠的请况,是哪里有问题啊


#include 
#include 
#include 
#include 
int main()
{
    FILE *fp;
    fp = fopen("time_log.txt", "a+");

    time_t ctime;
    struct tm *mlocaltime;
    long long int n = 1;
    char buff[24];
    fseek(fp, 0, SEEK_SET);
    while (fread(buff, sizeof(char), 24, fp) != 0)
    {
        n++;
    }
    while (1)
    {
        ctime = time(NULL);
        mlocaltime = localtime(&ctime);
        printf("%d-%d-%d %d:%d:%d\n", mlocaltime->tm_year + 1900, mlocaltime->tm_mon + 1, mlocaltime->tm_mday, mlocaltime->tm_hour, mlocaltime->tm_min, mlocaltime->tm_sec);
        fprintf(fp, "%d\t", n);
        fprintf(fp, "%d-%d-%d %d:%d:%d\n", mlocaltime->tm_year + 1900, mlocaltime->tm_mon + 1, mlocaltime->tm_mday, mlocaltime->tm_hour, mlocaltime->tm_min, mlocaltime->tm_sec);
        sleep(1);
        // fflush(fp);
        n++;
    }
}

img

是不是你有不止一个程序实例在运行

出现行号重叠的原因是因为你在向文件写入数据时使用了“a+”模式打开文件,这种模式表示以读写方式打开文件,并将文件指针定位于文件末尾,每次写入数据时都会从文件末尾处开始写入,这就导致了数据覆盖的问题。

要解决这个问题,你可以在每次写入数据之前通过 fseek() 函数将文件指针定位到文件的开头,然后再写入数据即可。
修改如下:

img

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

int main() {
    FILE *fp = fopen("time_log.txt", "a+");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    time_t ctime;
    struct tm *mlocaltime;
    int n = 1;
    char buff[24];

    while (fread(buff, sizeof(char), 24, fp) != 0) {
        n++;
    }

    while (1) {
        ctime = time(NULL);
        mlocaltime = localtime(&ctime);
        printf("%d-%d-%d %d:%d:%d\n", mlocaltime->tm_year + 1900, mlocaltime->tm_mon + 1, mlocaltime->tm_mday,
               mlocaltime->tm_hour, mlocaltime->tm_min, mlocaltime->tm_sec);

        fseek(fp, 0, SEEK_END);         // 将文件指针定位于文件末尾
        fprintf(fp, "%d\t", n++);
        fprintf(fp, "%d-%d-%d %d:%d:%d\n", mlocaltime->tm_year + 1900, mlocaltime->tm_mon + 1, mlocaltime->tm_mday,
                mlocaltime->tm_hour, mlocaltime->tm_min, mlocaltime->tm_sec);
        fflush(fp);                     // 立即将数据写入到文件中
        sleep(1);
    }

    fclose(fp);
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7671573
  • 你也可以参考下这篇文章:操作符知识你会了,那表达式求值呢?
  • 除此之外, 这篇博客: 浮点型如何在内存中进行存储呢?中的 ,那么,最终的结果会是什么样呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

     我们发现,代码跑出来的答案和我们自己想的有很大的差距:

    我们观察第一个结果,,n以整型的形式放进去,然后再以整型%d的形式取出来,结果是9,这是合理的,,第二个结果是,n以整型的形式存进去,然后以%f,浮点型的形式取出来,,

    int整型占4byte,float类型也占4byte,float*类型的指针变量pFloat,解引用就会访问4byte,跳过一个float类型,而拿出来的结果是不一样的,不是9.000000,这就说明,浮点型和整型在

    内存中的存储方式是不一样的,如果一样的话,拿出来的结果应该是一样的,对于第三个结果,,以浮点型的形式存进去,再以%d整型的形式取出来,结果不是9,这又说明了,浮点型和

    整型在内存中的存储方式是不一样的,对于第四个结果,以浮点型的形式存进去,然后以%f浮点型的形式取出来,结果是9.000000,这是合理的;

    整形的视角放进去,再以整型的视角拿出来,,结果是对的,,以浮点型的视角放进去,再以浮点型的视角拿出来,,结果也是对的,,但是混淆放拿结果就是乱的;

    *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大? 要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
  • 您还可以看一下 陈槐老师的零基础新手入门软件测试必知必会课程中的 项目实战中测试用例管理工具有哪些小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题出在代码的时间获取方式使用了time库中的strftime函数来获取,而它的精度只能到秒级别,无法在同一秒内获取不同的时间值,导致多次写入的行号相同。要修复这个问题,可以改用更高精度的time库中的time函数来获取时间戳,再转成可以直接写入文件的字符串形式。具体实现代码如下:

    import time
    
    i = 0
    while True:
        i += 1
        f = open("file.txt", "a")
        now = time.time()
        timestamp = round(now, 6) # 保留小数点后6位,达到微秒级别的精度
        time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) + "." + str((timestamp % 1) * 1000000)[0:3].zfill(3)
        # 将时间戳转为格式化字符串,加上小数点和6位微秒,并补全3位小数点后的0
        f.write(str(i) + " " + time_str + "\n")
        f.close()
        time.sleep(1)
    

    在这个版本的代码中,利用了time库中的time函数来获取当前时间戳,保留了小数点后6位,达到了微秒级别的精度。然后再使用time库中的localtime函数将时间戳转为格式化字符串,注意要手动加上小数点和6位微秒,并补全小数点后的0。这样就可以保证每个写入文件的行的行号是唯一的。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^