IO进程线程-标准IO(结)
目录
1.思维导图
2.笔记
3.作业
3.1题
3.2题
1.思维导图
2.笔记
有道云笔记
3.作业
3.1题
计算文件行数
// 使用fputs fgets
// 要求拷贝一个文件,例如将1.c中的内容拷贝到2.c中
// 要求计算一个文件的大小。
#include <stdio.h>
#include <string.h>
/// @brief 拷贝文件
/// @param destfile 目标文件名
/// @param srcfile 源文件名
/// @return 成功0 失败-1
int copy_file(const char* destfile, const char* srcfile);
/// @brief 计算文件大小
/// @param filename 文件路径及文件名
/// @return 成功返回文件大小 失败返回-1
int size_file(const char* filename);
/// @brief 计算文件行数
/// @param filename 文件路径及文件名
/// @return 成功返回文件行数 失败返回-1
int line_file(const char* filename);
int main(int argc, const char* argv[])
{
// 1.校验参数
if (argc != 3) {
printf("input error\n");
printf("usage: ./a.out filename filename\n");
return -1;
}
// 2.拷贝文件
copy_file(argv[2], argv[1]);
// 3.计算文件大小
int size = size_file(argv[1]);
printf("%s文件大小=%d\n", argv[1], size);
// 4.计算文件行数
int line = line_file(argv[1]);
printf("%s文件行数=%d\n", argv[1], line);
return 0;
}
int copy_file(const char* destfile, const char* srcfile)
{
// 1.以只读方式打开源文件
FILE* srcfp = fopen(srcfile, "r");
if (NULL == srcfp) {
perror("fopen srcfile");
return -1;
}
// 2.以只写的方式打开目标文件
FILE* desthp = fopen(destfile, "w");
if (NULL == desthp) {
perror("fopen destfile");
fclose(srcfp);
return -1;
}
// 3.读取数据
char buf[128] = "";
while (fgets(buf, sizeof(buf), srcfp)) {
fputs(buf, desthp);
}
fclose(srcfp);
fclose(desthp);
return 0;
}
int size_file(const char* filename)
{
// 1.以只读方式打开源文件
FILE* fp = fopen(filename, "r");
if (NULL == fp) {
perror("fopen file");
return -1;
}
// 2.读取数据
int size = 0;
char buf[128] = "";
while (fgets(buf, sizeof(buf), fp)) {
size += strlen(buf);
}
fclose(fp);
return size;
}
int line_file(const char* filename)
{
// 1.以只读方式打开源文件
FILE* fp = fopen(filename, "r");
if (NULL == fp) {
perror("fopen file");
return -1;
}
// 2.读取数据
int line = 0;
char buf[128] = "";
while (fgets(buf, sizeof(buf), fp)) {
if(buf[strlen(buf) - 1] == '\n'){
line++;
}
}
fclose(fp);
return line;
}
3.2题
// 要求创建个time.txt, 存储内容格式如下:
// [1] 2022-07-28 17:15:06// [2] 2022-07-28 17:15:07
// [3] 2022-07-28 17:15:08
// ctrl + c退出程序,过一会儿之后重新启动程序
// [1] 2022-07-28 17:15:06
// [2] 2022-07-28 17:15:07
// [3] 2022-07-28 17:15:08 <----------
// [4] 2022-07-28 17:16:31
// [5] 2022-07-28 17:16:32
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/// @brief 计算文件行数
/// @param fp 文件指针
/// @return 成功返回文件行数 失败返回-1
int line_file(FILE* fp);
int main(int argc, const char* argv[])
{
// 1.校验参数
if (argc != 2) {
printf("input error\n");
printf("usage: ./a.out filename\n");
return -1;
}
// 2.以追加打开文件
FILE* fp = fopen(argv[1], "a");
if (NULL == fp) {
perror("fopen");
return -1;
}
// 2.计算文件行数
int line = line_file(fp);
// 3.获取当前时间
time_t t; // 保存当前时间(秒)
struct tm* tm_p = NULL; // 保存当前格式化时间
while (1) {
t = time(NULL);
if (t == -1) {
perror("time");
return -1;
}
// 4.格式化当前时间
tm_p = localtime(&t);
if (NULL == tm_p) {
perror("localtime");
return -1;
}
// 5.格式化字符串
fprintf(fp, "[%d] %d-%02d-%02d %02d:%02d:%02d\n",
line + 1, tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,
tm_p->tm_hour, tm_p->tm_min, tm_p->tm_sec);
// 6.刷新缓冲区
fflush(fp);
// 7.移动行号
line++;
// 8.休眠1秒
sleep(1);
}
return 0;
}
int line_file(FILE* fp)
{
// 1.读取数据
int line = 0;
char buf[128] = "";
while (fgets(buf, sizeof(buf), fp)) {
if (buf[strlen(buf) - 1] == '\n') {
line++;
}
}
return line;
}