day7 标准IO练习

问题:每隔1秒向文件1.txt写入当前系统时间,行号递增

算法思路:

1、time() 用来获取系统时间(秒数);

time_t time(time_t *seconds) 

1970.1.1 0:0:0到现在的秒数

2、localtime() 将系统时间转换为本地时间;

struct tm *localtime(const time_t *timer)
struct tm {
               int tm_sec;         /* 秒,范围从 0 到 59                
               int tm_min;         /* 分,范围从 0 到 59                
               int tm_hour;        /* 小时,范围从 0 到 23                
               int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    
               int tm_mon;         /* 月份,范围从 0 到 11                
               int tm_year;        /* 自 1900 起的年数                
               int tm_wday;        /* 一周中的第几天,范围从 0 到 6                
               int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    
               int tm_isdst;       /* 夏令时                         
};

注意:

int tm_mon  。。。。获取的值要加1是正确月份;

int tm_tear  。。。。获取的值要加1900是正确的年份;

3、获取文件内的所有行数量:

while(fgets (buf, 32, fp) != NULL) {

    //判断是否是一行结束
        if (buf[strlen(buf)-1] == '\n') {  
                linecount++;
        }
}

4、写完文件记得fflush ,刷新流, 写到磁盘中去。

代码实现

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

int main(int argc, const char *argv[])
{
	FILE *fp;
	time_t ctime;
	struct tm *ctimestr;
	int linecount = 0;
	char buf[32];

	fp = fopen("test.txt", "a+");
	if (fp == NULL) {
		perror("fopen");
		return 0;
	}

	
	while(fgets(buf, 32, fp) != NULL) {

		if (buf[strlen(buf)-1] == '\n') {
			linecount++;
		}
	}


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

		
		fprintf(fp, "%d, %04d-%02d-%02d %02d:%02d:%02d\n", linecount, ctimestr->tm_year+1900, ctimestr->tm_mon+1, ctimestr->tm_mday,
				                      ctimestr->tm_hour, ctimestr->tm_min, ctimestr->tm_sec);
		
		
		fflush(fp);

		linecount++;

		sleep(1);
	}


	fclose(fp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题需要用到一些 Java 的基础知识和类库,我来帮你解答。 首先,我们需要用到 Java 内置的类库 `java.util.Calendar`,它提供了一些用于处理日历的方法。我们可以使用 `Calendar.getInstance()` 方法来获取一个 `Calendar` 对象,然后使用 `set(year, month, day)` 方法来设置年份和月份,最后使用 `getActualMaximum(Calendar.DAY_OF_MONTH)` 方法来获取该月的天数。 接下来,我们需要读取用户从键盘输入的年份和月份。可以使用 `Scanner` 类来实现,如下所示: ```java Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); int year = scanner.nextInt(); System.out.print("请输入月份:"); int month = scanner.nextInt(); ``` 接下来,我们可以使用 `Calendar` 类来获取日历,然后将其输出到控制台上,代码如下所示: ```java import java.util.Calendar; import java.util.Scanner; public class CalendarDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); int year = scanner.nextInt(); System.out.print("请输入月份:"); int month = scanner.nextInt(); Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, 1); System.out.println(cal.getDisplayName(Calendar.MONTH, Calendar.LONG, null) + " " + year); System.out.println("Su Mo Tu We Th Fr Sa"); int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); for (int i = 1, day = 1; day <= maxDay; i++) { StringBuilder sb = new StringBuilder(); for (int j = 1; j <= 7; j++) { if (day > maxDay) { sb.append(" "); } else if (i == 1 && j < firstDayOfWeek) { sb.append(" "); } else { sb.append(String.format("%2d ", day)); day++; } } System.out.println(sb.toString()); } } } ``` 最后,我们需要将输出的日历保存到文件中。可以使用 `PrintWriter` 类来打开一个文件,然后使用 `println()` 方法将日历写入文件,代码如下所示: ```java import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Calendar; import java.util.Scanner; public class CalendarDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); int year = scanner.nextInt(); System.out.print("请输入月份:"); int month = scanner.nextInt(); Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, 1); System.out.println(cal.getDisplayName(Calendar.MONTH, Calendar.LONG, null) + " " + year); System.out.println("Su Mo Tu We Th Fr Sa"); int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); StringBuilder sb = new StringBuilder(); for (int i = 1, day = 1; day <= maxDay; i++) { for (int j = 1; j <= 7; j++) { if (day > maxDay) { sb.append(" "); } else if (i == 1 && j < firstDayOfWeek) { sb.append(" "); } else { sb.append(String.format("%2d ", day)); day++; } } sb.append("\n"); } try (PrintWriter out = new PrintWriter("calendar.txt")) { out.println(cal.getDisplayName(Calendar.MONTH, Calendar.LONG, null) + " " + year); out.println("Su Mo Tu We Th Fr Sa"); out.print(sb.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } } } ``` 这样,我们就完成了从键盘输入任意年份和月份,输出该月份的日历,并将其输出到文件中的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值