如何从文本文件中读取“10:55”这样的时间,以便用C语言进行计算?
How to read a time like "10:55" from a text file so that we can do calculation with it in C programming language?
我正在尝试从文本文件中读取类似数据的时间(即 10:55),并以我可以用它进行计算的方式分配它。例如,如果我想将 10:55 中的 10 小时 55 分钟转换为分钟:
10*60+55=655。但是 10:55 包含':'所以我不能直接将它分配给一个整数。
到目前为止,我能够使用 atoi(char *ptr) 函数解决这个问题,该函数将字符串中的数字转换为整数类型 data.The 代码是 运行 就好了,但我不确定这个函数是如何工作的.因为字符串“10:55”包含一个非数值,所以它不应该在检测到“:”时立即 return 垃圾值。但在我的例子中它是 returns 10 然后,在我将指针移动 3 个位置后,它给出了 55。
因此,如果有人详细说明此功能的确切工作原理,那将非常有帮助。
最后,有没有其他方法可以不使用 atoi() 函数而只使用基本的 C 编程技术来解决这个问题。如果是,请与 me.Thanks 分享您的代码和解释,以获得帮助。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int hh,mm;
char startingtime[6];
int strtimearr[2];
FILE *start=fopen("start.txt","w");
if(start==NULL)
{
printf("FILE DOES NOT EXIST");
}
printf("START TIME\n");
printf("->HOUR(hh):");
scanf("%d",&hh);
printf("->MINUTE(mm):");
scanf("%d",&mm);
fprintf(start,"%d:%d",hh,mm);
fclose(start);
start = fopen("start.txt", "r");
if(start==NULL)
{
printf("FILE DOES NOT EXIST");
}
fscanf(start, "%s", startingtime);
fclose(start);
//puts(startingtime);
char *s1= startingtime;
strtimearr[0] = atoi(s1);
strtimearr[1] = atoi(s1+3);
printf("Time : %d:%d \nconverted to minute : %d",strtimearr[0],strtimearr[1],(strtimearr[0]*60+strtimearr[1]));
}
您问题的第一部分已作为评论回答。
关于第二个问题,您可以使用 fscanf
直接从文件中读取整数值,而不是读取 char 数组并将其转换为 int atoi
:
fscanf(start,"%d:%d", &strtimearr[0], &strtimearr[1]);
如果fscanf
成功,则returns读取成功的条数,否则返回EOF。
How to read a time like “10:55” from a text file
您可以使用 fscanf, or combine fgets (or maybe getline(3) or even on Linux readline(3) ...) and sscanf
or strtol but then don't forget to test its return value (some int
for fscanf
etc...). You might be interested by the %n
format control string directive to fscanf
or sscanf(3) ....
您可以在 POSIX 或 Linux 系统上使用 time(7) facilities. So #include <time.h>
then use strptime(3) or getdate(3)。
您可以逐字节读取并使用 fgetc. Check for error conditions (at least EOF
). Be aware of UTF-8, in 2020 it is almost everywhere ....
不要忘记检查 parsing 个错误。
文本文件中像 123:456
这样的时间可能没有意义,您应该检查此类输入错误(并且可能至少给出此类输入没有意义的行号) .
您的程序应使用 perror
或 strerror(3) when fopen
fails. Be also aware that stdout
is usually line buffered (except in command pipelines). Consider using fflush and/or setvbuf。
当然读how to debug small programs and what every C programmer should know about undefined behavior. Consider reading the C11 standard n1570 ...
在 compiling. If you use a recent GCC compiler on your C code, compile it with gcc -Wall -Wextra -g
时启用所有警告和调试信息。
它可以工作,但不够健壮。如果用户为小时或分钟给出的数字大于 99,则您将向文件写入超过 5 个字节。然后在阅读时,您将阅读调用 Undefined Behavious 的 startingtime
数组的结尾。另一方面,如果小时小于 10,分钟字段将从位置 2 而不是 3 开始。
对于IO,规则是写时严,读时宽容。所以我建议你使用更严格的格式来编写: fprintf(start,"%2d:%02d",hh,mm);
或 fprintf(start,"%02d:%02d",hh,mm);
以与小于 10 的值保持一致。
在阅读时,您至少可以使用 fscanf(start, "%5s", startingtime);
限制大小,然后使用 sscanf
解码:
int cr = sscanf(startingtime, "%d:%d", strtimearr, strtimearr+1);
或者直接在读取时用fscanf
解码:
int cr = fscanf(start, "%d:%d", strtimearr, strtimearr+1);
并在打印结果前控制cr
为2
我正在尝试从文本文件中读取类似数据的时间(即 10:55),并以我可以用它进行计算的方式分配它。例如,如果我想将 10:55 中的 10 小时 55 分钟转换为分钟: 10*60+55=655。但是 10:55 包含':'所以我不能直接将它分配给一个整数。 到目前为止,我能够使用 atoi(char *ptr) 函数解决这个问题,该函数将字符串中的数字转换为整数类型 data.The 代码是 运行 就好了,但我不确定这个函数是如何工作的.因为字符串“10:55”包含一个非数值,所以它不应该在检测到“:”时立即 return 垃圾值。但在我的例子中它是 returns 10 然后,在我将指针移动 3 个位置后,它给出了 55。 因此,如果有人详细说明此功能的确切工作原理,那将非常有帮助。
最后,有没有其他方法可以不使用 atoi() 函数而只使用基本的 C 编程技术来解决这个问题。如果是,请与 me.Thanks 分享您的代码和解释,以获得帮助。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int hh,mm;
char startingtime[6];
int strtimearr[2];
FILE *start=fopen("start.txt","w");
if(start==NULL)
{
printf("FILE DOES NOT EXIST");
}
printf("START TIME\n");
printf("->HOUR(hh):");
scanf("%d",&hh);
printf("->MINUTE(mm):");
scanf("%d",&mm);
fprintf(start,"%d:%d",hh,mm);
fclose(start);
start = fopen("start.txt", "r");
if(start==NULL)
{
printf("FILE DOES NOT EXIST");
}
fscanf(start, "%s", startingtime);
fclose(start);
//puts(startingtime);
char *s1= startingtime;
strtimearr[0] = atoi(s1);
strtimearr[1] = atoi(s1+3);
printf("Time : %d:%d \nconverted to minute : %d",strtimearr[0],strtimearr[1],(strtimearr[0]*60+strtimearr[1]));
}
您问题的第一部分已作为评论回答。
关于第二个问题,您可以使用 fscanf
直接从文件中读取整数值,而不是读取 char 数组并将其转换为 int atoi
:
fscanf(start,"%d:%d", &strtimearr[0], &strtimearr[1]);
如果fscanf
成功,则returns读取成功的条数,否则返回EOF。
How to read a time like “10:55” from a text file
您可以使用 fscanf, or combine fgets (or maybe getline(3) or even on Linux readline(3) ...) and sscanf
or strtol but then don't forget to test its return value (some int
for fscanf
etc...). You might be interested by the %n
format control string directive to fscanf
or sscanf(3) ....
您可以在 POSIX 或 Linux 系统上使用 time(7) facilities. So #include <time.h>
then use strptime(3) or getdate(3)。
您可以逐字节读取并使用 fgetc. Check for error conditions (at least EOF
). Be aware of UTF-8, in 2020 it is almost everywhere ....
不要忘记检查 parsing 个错误。
文本文件中像 123:456
这样的时间可能没有意义,您应该检查此类输入错误(并且可能至少给出此类输入没有意义的行号) .
您的程序应使用 perror
或 strerror(3) when fopen
fails. Be also aware that stdout
is usually line buffered (except in command pipelines). Consider using fflush and/or setvbuf。
当然读how to debug small programs and what every C programmer should know about undefined behavior. Consider reading the C11 standard n1570 ...
在 compiling. If you use a recent GCC compiler on your C code, compile it with gcc -Wall -Wextra -g
时启用所有警告和调试信息。
它可以工作,但不够健壮。如果用户为小时或分钟给出的数字大于 99,则您将向文件写入超过 5 个字节。然后在阅读时,您将阅读调用 Undefined Behavious 的 startingtime
数组的结尾。另一方面,如果小时小于 10,分钟字段将从位置 2 而不是 3 开始。
对于IO,规则是写时严,读时宽容。所以我建议你使用更严格的格式来编写: fprintf(start,"%2d:%02d",hh,mm);
或 fprintf(start,"%02d:%02d",hh,mm);
以与小于 10 的值保持一致。
在阅读时,您至少可以使用 fscanf(start, "%5s", startingtime);
限制大小,然后使用 sscanf
解码:
int cr = sscanf(startingtime, "%d:%d", strtimearr, strtimearr+1);
或者直接在读取时用fscanf
解码:
int cr = fscanf(start, "%d:%d", strtimearr, strtimearr+1);
并在打印结果前控制cr
为2