任务描述
请实现如下功能:
写一个程序 mycat.c
,其功能是接收命令参数中的文件名,并将该文件的内容显示出来。要求首先在 Ubuntu 中测试该程序,然后用版本 0 内核启动 bochs 虚拟机,在该虚拟机中编译运行该程序,画面如下图所示:
代码实现
这里用到了C语言文件FILE操作,具体使用的函数参照C语言详解 FILE文件操作
这里列举几个用到的函数
文件打开与关闭
文件打开:fopen函数的调用方式为:fopen(文件名,使用方式);
-
“r”(只读):只能从文件中读数据,该文件必须先存在,否则打开失败
-
“w”(只写):只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
-
“a”(追加):向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
-
“rb”(只读):只能从文件中读数据,该文件二进制文件必须先存在,否则打开失败
-
“wb”(只写):向文件写数据,若指定的二进制文件不存在则创建它,如果存在则先删除它再重建一个新文件
-
“ab”(追加):向二进制文件尾部添加数据,若文件不存在则打开失败,打开时位置指针移到文件末尾
-
“r+”:可读/写数据,该文件必须先存在,否则打开失败
-
“w+”:可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
-
“a+”:可读/写数据,原来的文件不被删去,位置指针移到文件末尾
文件关闭:fclose(FILE *),关闭成功返回值0,否则返回非零值。
注:在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。
文件顺序读写
函数名 | 调用形式 | 功能 | 返回值 |
---|---|---|---|
fgetc | fgetc(fp) | 从fp指向的文件读入一个字符 | 读取成功,返回所读的字符,失败则返回文件结束标志EOF(-1) |
fputc | fputc(ch, fp) | 把字符ch写到文件指针变量fp所指的文件中 | 写入成功,返回所写的字符, 写入失败返回EOF(-1) |
代码
#include <stdio.h>
int main(int argc, char *argv[]){
FILE *fp = fopen(argv[1], "r"); //main函数第二个参数为文件名,创建文件指针
char chr;
if(argc < 2 || fp == NULL) //检测到没有输入文件名或为空,返回 -1
return -1;
while(!feof(fp))
//feof: f end of file文件是否到末尾,常用----!feoffp)----表示到了文件末尾结束循环
{
chr = fgetc(fp); //每一次从fpp所指向的文件中拿到一个字符,并打印在显示器上
putchar(chr);
}
fclose(fp);
return 0;
}
编译实现
使用 gcc mycat.c -o mycat
编译,实现效果: