#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++;
}
}
是不是你有不止一个程序实例在运行
出现行号重叠的原因是因为你在向文件写入数据时使用了“a+”模式打开文件,这种模式表示以读写方式打开文件,并将文件指针定位于文件末尾,每次写入数据时都会从文件末尾处开始写入,这就导致了数据覆盖的问题。
要解决这个问题,你可以在每次写入数据之前通过 fseek() 函数将文件指针定位到文件的开头,然后再写入数据即可。
修改如下:
#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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:我们发现,代码跑出来的答案和我们自己想的有很大的差距:
我们观察第一个结果,,n以整型的形式放进去,然后再以整型%d的形式取出来,结果是9,这是合理的,,第二个结果是,n以整型的形式存进去,然后以%f,浮点型的形式取出来,,
int整型占4byte,float类型也占4byte,float*类型的指针变量pFloat,解引用就会访问4byte,跳过一个float类型,而拿出来的结果是不一样的,不是9.000000,这就说明,浮点型和整型在
内存中的存储方式是不一样的,如果一样的话,拿出来的结果应该是一样的,对于第三个结果,,以浮点型的形式存进去,再以%d整型的形式取出来,结果不是9,这又说明了,浮点型和
整型在内存中的存储方式是不一样的,对于第四个结果,以浮点型的形式存进去,然后以%f浮点型的形式取出来,结果是9.000000,这是合理的;
以整形的视角放进去,再以整型的视角拿出来,,结果是对的,,以浮点型的视角放进去,再以浮点型的视角拿出来,,结果也是对的,,但是混淆放拿结果就是乱的;
问题出在代码的时间获取方式使用了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。这样就可以保证每个写入文件的行的行号是唯一的。