题目
代码如下:
head.h
#ifndef __HEAD_H_
#define __HEAD_H_
#include <stdio.h>
#include <string.h>
#define PRINT_ERR(msg) \
do { \
perror(msg); \
return -1; \
} while (0)
#endif // !__HEAD_H_
test_fgets_line_copy.c
#include "head.h"
/**
* @brief 计算源文件行数
*
* @param src_fp 文件指针
* @return int 返回行数
*/
int Caculate_line(FILE* src_fp)
{
int line = 0;
char buf[10] = { 0 };
//循环读取文件内容知道文件末尾
while ((fgets(buf, sizeof(buf), src_fp)) != NULL) {
if (buf[strlen(buf) - 1] == '\n') {
line++;
}
}
return line;
}
/**
* @brief 拷贝文件
*
* @param src_fp 源文件指针
* @param dest_fp 目标文件指针
*/
void Copy_File(FILE* src_fp, FILE* dest_fp)
{
char buf[10] = { 0 };
//循环读取文件内容知道文件末尾
while ((fgets(buf, sizeof(buf), src_fp)) != NULL) {
fputs(buf, dest_fp); //将读取到的内容写到目标文件中
}
}
int main(int argc, char const* argv[])
{
FILE *src_fp, *dest_fp;
int line;
//1.校验用户传递的参数
if (argc != 3) {
//将错误信息写到标准出错中,标准错误没有缓冲区会直接显示
fputs("input error,try again!\n", stderr);
fputs("use style : ./a.out srcfile destfile\n", stderr);
return -1;
}
//2.打开源文件(只读)和目标文件(只写)
if ((src_fp = fopen(argv[1], "r")) == NULL) {
PRINT_ERR("fopen srcfile error");
}
if ((dest_fp = fopen(argv[2], "w")) == NULL) {
PRINT_ERR("fopen destfile error");
}
//3.拷贝文件
Copy_File(src_fp, dest_fp);
//4.此时已经读完源文件,所以光标在源文件结尾出处
//若要计算行数,需要将光标移到文件开头
fseek(src_fp, 0, SEEK_SET);
//5.计算源文件行数
line = Caculate_line(src_fp);
printf("行数:%d\n", line);
//6.关闭文件
fclose(src_fp);
fclose(dest_fp);
return 0;
}
运行结果如下: