实验:编写Windows中的Cat
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验:编写Windows中的Cat相关的知识,希望对你有一定的参考价值。
实验:编写Windows中的Cat
文章目录
实验目标
在Windows中编写类似Linux中的Cat读取文件指令,并使其能够在终端中任意文件夹中读取文件
加分项:
- 读取到文件夹时丢出特定错误
详细步骤
1.了解Linux的Cat命令
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上
①在WSL2子系统下试验cat命令
②Windows的替代命令:type
type在powershell和cmd里都能用
windows powershell也能用cat,但cmd不行
- cmd
- powershell
③参考教程
2.复习C语言文件
①最基本的文件读写操作
- 经过简单复习,写了下面这样一个程序
在vscode中运行
#include<stdio.h>
#include<stdlib.h>//文件操作函数要用到
int main()
{
FILE*fp; //定义一个文件指针
//打开一个文件
char ch=0;
fp=fopen("tmp.py","r+");
if(fp == NULL)
{
printf("打开失败\\n");
}
else
{
printf("打开成功\\n");
//从文件中读取一个字符
ch=fgetc(fp);
while(!feof(fp))
{
printf("%c",ch);
ch=fgetc(fp);
}
fclose(fp);//关闭文件
}
return 0;
}
其中tmp.py是用于测试的py文件
在终端里手动编译运行
参考教程
CSDN: C语言 | 使用windows命令行下编译C语言
这个教程里面的截图里面的运行命令不对
看到报错后改回了正确的运行方式
文件名字是file.c
- 若编译命令为
gcc file.c
则生成的可执行文件默认为a.exe
那么运行命令就是
.\\a.exe
- 若添加-o 参数,就可以指定可执行文件的名字
gcc file.c -o file.exe
此时运行的命令就是
.\\file.exe
② int argc,char *argv[]
或int argv,char **argc
搜了一些cat的源代码…发现自己这个玩意儿忘了…
啊,不是忘了…是当时大一的时候好像没学明白…重新学吧
👉B站还有个up讲的还行
👉CSDN上也有一个高赞总结:关于int main( int argc, char* argv[] ) 中argc和argv参数的解析及调试
-
argc在C语言中表示运行程序时传递给main()函数的命令行参数个数。
argv在C语言中表示运行程序时用来存放命令行字符串参数的指针数组
-
注意argv[0]指向程序运行的全路径名
3.C语言实现命令行读取文件
在网上找了一个用到argc,argv读文件的代码,试了下
但搜了好久那种直接能在命令行进行的指令的才知道那些叫批处理命令😓
4.意识到要用批处理命令…(换python,用.bat文件启动python文件)
查找资料发现C语言可以启动.bat文件,但是反过来不行… 只好换python了
①用python写出基本的读文件
import sys
def readfile(filename):
f = open(filename, "r", encoding='utf-8')
while True:
line = f.readline()
if len(line) == 0:
break
# end='',防止换行
print(line, end='')
f.close()
if __name__ == '__main__':
if len(sys.argv) < 2:
print('No file was input')
sys.exit()
else:
for filename in sys.argv[1:]:
readfile(filename)
注意点:
- 如果print后面没加
end=''
,那读出来的每一行都会换行,像这样:
- 如果没写
encoding='utf-8'
,文件中读到中文会报错:
②加入区分文件夹的功能
import sys
import os
def readfile(filename):
#判断是否为文件夹
if os.path.isdir(filename):
print("It is a folder")
elif os.path.isfile(filename):
f = open(filename, "r", encoding='utf-8')
while True:
line = f.readline()
if len(line) == 0:
break
# end='',防止换行
print(line, end='')
f.close()
if __name__ == '__main__':
if len(sys.argv) < 2:
print('No file was input')
sys.exit()
else:
for filename in sys.argv[1:]:
readfile(filename)
- 以tmp文件夹做试验
成功抛出错误:It is a folder
- 文件测试
5.使用批处理文件
- 首先新建一个.bat脚本
-
打开文本编辑器,写入下面的命令
👉参考教程
@echo off
@python.exe cat.py的路径 %1
exit
链接:关于.bat常用的DOS命令
%1:
-
执行bat命令:
在那个.bat脚本所在文件夹内:
- 若是使用
Powershell
:
需要加上
.\\
,.bat
可加可不加.\\cat_Of_Windows.bat cat.py
若执行bat命令的时候,在shell中出现这种情况:可以按照这个教程去记事本修改编码为ANSI
VScode也可以修改编码: https://blog.csdn.net/kate_mj/article/details/104774232
- 若是使用
cmd
cat_Of_Windows.bat cat.py
.bat
可加可不加如果bat文件中加了
exit
,那运行完就直接退出了,这里演示的时候暂时删掉了exit - 若是使用
添加环境变量使之能在其他路径使用
注意是bat所在的文件夹的路径,而不是bat文件本身的完整路径添加到PATH环境变量,这里踩坑好久
测试打开文件和文件夹
在桌面上测试:
文件和文件夹均测试成功🎆✌️
总结反思
-
之前用IDE 一键编译运行C语言文件,没有搞清楚其中的区别
-
知道了.bat文件和.cmd文件,批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令
-
还要再去多了解一些DOS命令
-
上面的python文件还存在一些问题,指定的读文件编码是utf-8,测试的时候还遇到了一些编码如:
暂时还没去解决,留了个搜到的参考链接
以上是关于实验:编写Windows中的Cat的主要内容,如果未能解决你的问题,请参考以下文章
片段中 ListView 的 setOnItemClickListener