本帖最后由 jackz007 于 2024-2-28 13:41 编辑
首先,应该明确一点,用 C 语言是无法直接解析、读取 Excel 文件的。只能把 Excel 中的信息保存为文本文件,然后,才能用 C 语言写代码解决。
把签到信息写入文本文件 "x.dat",注意,在 Windows 10 和 Windows 11 上用记事本保存的时候,需要干预文本编码,缺省值是 'UTF-8',必须改为 'ANSI' ,然后再存盘。接下来,再把下面的源代码在相同目录下存盘(注意,如果使用的是记事本,同样还是需要干预文本编码,必须是 'ANSI'),然后编译、运行。#include <stdio.h>
int main(void)
{
FILE * fp ;
char s[256] ;
int d , i , j , k , m , p , q , r ;
if((fp = fopen("x.dat" , "r"))) {
for(i = 0 , k = 60 * 60 * 8 + 60 * 20 , m = 0 ; ! feof(fp) ; i ++) {
fgets(s , 256 , fp) ;
for(j = 0 ; s[j] ; j ++) ; // 获取字符串 s 的长度 j
for(j -- ; j && s[j] && s[j] == '\n' ; j --) s[j] = '\0' ; // 剔除字符串尾部的 '\n'
sscanf(& s[11] , "%d:%d:%d" , & p , & q , & r) ; // 从 s 中读取 时(p)、分(q)、秒(r)
d = p * 60 * 60 + q * 60 + r ; // 把时分秒换算成秒数
if(d <= k) { // 如果秒数小于 08:20:00
printf("%3d : %3d - %s\n" , m + 1 , i + 1 , s) ; // 打印签到信息
m ++ ; // 准点签到人数加 1
}
}
fclose(fp) ;
printf("共有 [%d] 人按时上班.\n" , m) ;
} else {
fprintf(stderr , "无法打开文件 [x.dat]\n") ;
}
}
编译、运行实况:D:\[exercise]\C>g++ -o x x.c
D:\[exercise]\C>x
1 : 45 - 2024-02-28 08:19:56
2 : 46 - 2024-02-28 08:19:54
3 : 47 - 2024-02-28 08:19:51
4 : 48 - 2024-02-28 08:19:50
5 : 49 - 2024-02-28 08:19:49
6 : 50 - 2024-02-28 08:19:45
7 : 51 - 2024-02-28 08:19:46
8 : 52 - 2024-02-28 08:19:36
9 : 53 - 2024-02-28 08:19:35
10 : 54 - 2024-02-28 08:19:35
共有 [10] 人按时上班.
D:\[exercise]\C>
|