操作系统原理实验 :C语言创建进程,获取系统日期并写入文本文件,更新为当前运行日期

本文章仅供本人作为学习笔记,也很荣幸能给大家参考学习
问题实现:
在Windows环境下,利用高级语言编程环境(限定为VS环境或VC环境)调用相关的系统调用(CreateProccess,即系统API)实现一个包括“进程创建,文件读写”功能的应用程序。有一个文本文件CommandList.txt,第一行是说明性文字:本文件最后一次打开和运行日期是20200224。第二行开始每行是一个可执行程序的名称(含路径)。编写一个应用程序能打开该文件,顺序执行其中的每个程序,并将文件第一行中的日期更新为当前日期
例如:运行程序前:运行程序前
运行程序后:运行程序后
可以看到记事本文件第一行日期已经自动更新了

重点:获取系统日期,并将该日期先转换为字符串,再写入CommandList.txt文件,更新日期
下面为获取系统日期代码:

//获取系统日期 
	time_t timep;
    struct tm *p;
    time (&timep);
    p=gmtime(&timep);
    int year=1900+p->tm_year;//年份,规定从1900年算起有多少年,所以加上1900得到年份
    int mon=1+p->tm_mon;//月份,月份从0算起,1月用0表示,故加上1
    int day=p->tm_mday ;//天数

将三个整数转换为字符串并合并在一起:

 //将日期转换为字符串开始代码 
	char string1[4] = {0};
	char string2[4] = {0};
	char string3[4] = {0};
	itoa(year,string1,10);   //itoa:将整数以十进制转换为字符串 
	itoa(mon,string2,10);
	itoa(day,string3,10);
	if(mon<10){
		strcat(string1,"0");//如果月份小于10月,则在年份后面加上0,例:将3月改为03月 
	} 
	strcat(string1,string2);//连接字符串 
	if(day<10){
		strcat(string1,"0");
	}
	strcat(string1,string3);  //将日期转换为字符串截至代码
	printf("当天日期为:"); 
	puts(string1); 

操作CommandList.txt文件:

//文件操作开始代码 
	FILE *fp;
	fp=fopen("CommandList.txt","rt+");
	char *pt;
	fseek(fp,30L,0);//定位第一行文字的日期位置 ,30L表示日期前面15个汉字占用的字节数 
	pt=string1;     //从第16个文字开始修改日期为系统日期(修改字符串) 
	fputs(pt,fp);   //写入文件
	fclose(fp);//关闭文件 
	fp = NULL; //令文件指针为空

关于文件操作的内容,可以借鉴这篇博客:文件操作详解
接下来是完整程序代码:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	//获取系统日期 
	time_t timep;
    struct tm *p;
    time (&timep);
    p=gmtime(&timep);
    int year=1900+p->tm_year;//年份
    int mon=1+p->tm_mon;//月份
    int day=p->tm_mday ;//获取日期截至代码
    
    //将日期转换为字符串开始代码 
	char string1[4] = {0};
	char string2[4] = {0};
	char string3[4] = {0};
	itoa(year,string1,10);   //itoa:将整数转换为字符串 
	itoa(mon,string2,10);
	itoa(day,string3,10);
	if(mon<10){
		strcat(string1,"0");//例:将3月改为03月 
	} 
	strcat(string1,string2);//连接字符串 
	if(day<10){
		strcat(string1,"0");
	}
	strcat(string1,string3);
	  //将日期转换为字符串截至代码
	printf("当天日期为:"); 
	puts(string1); 
	
	//文件操作开始代码 
	FILE *fp;
	fp=fopen("CommandList.txt","rt+");
	char *pt;
	fseek(fp,30L,0);//定位第一行文字的日期位置 ,30L表示日期前面15个汉字占用的字节数 
	pt=string1;     //从第16个文字开始修改日期为系统日期(修改字符串) 
	fputs(pt,fp);   //写入文件 
	fclose(fp);//关闭文件 
	fp = NULL; //令文件指针为空
	//文件操作结束
	//创建进程模块 
    PROCESS_INFORMATION processInfo;
    STARTUPINFOA	startupInfo;
    ZeroMemory(&processInfo, sizeof(processInfo));
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    char *zw="C:\\Windows\\SysWOW64\\notepad.exe";	
	char *zw1="C:\\Windows\\SysWOW64\\calc.exe";
	char *zw2="C:\\Windows\\system32\\mspaint.exe";
	//char *zw3="D:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe";
    char *commandtext=" CommandList.txt";
	BOOL ret = CreateProcess(zw,commandtext,NULL, NULL, false, 
				0, NULL, NULL, &startupInfo, &processInfo);
    BOOL ret1 = CreateProcess(zw1,NULL,NULL, NULL, false, 
				0, NULL, NULL, &startupInfo, &processInfo);
    BOOL ret2 = CreateProcess(zw2,NULL,NULL, NULL, false, 
				0, NULL, NULL, &startupInfo, &processInfo);
	//BOOL ret3 = CreateProcess(zw3,NULL,NULL, NULL, false, 
				//0, NULL, NULL, &startupInfo, &processInfo);
	//创建进程结束
	//判断进程是否创建成功			
    if(ret)
	printf("create process ok...\n");
    else
    {
	printf("create process failed...\n");
	printf("error is %d", GetLastError());
    }
    if(ret1)
	printf("create process ok...\n");
    else
    {
	printf("create process failed...\n");
	printf("error is %d", GetLastError());
    }
    if(ret2)
	printf("create process ok...\n");
    else
    {
	printf("create process failed...\n");
	printf("error is %d", GetLastError());
    }
    return 0;
}

如果出现CommandList.txt打不开的问题,可以打开程序所在目录,将该文件复制进来(凡是与程序有关的外部文件,必须放在同一个目录下)
该文章仅供学习参考,如有部分不懂,可自行去查阅资料

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值