Linux 目录操作详解
Linux目录操作详解
- 1. 获取当前工作目录
- 1.1 getcwd()
- 1.2 get_current_dir_name()
- 2. 切换工作目录
- 2.1 chdir()
- 3. 创建和删除目录
- 3.1 mkdir()
- 3.2 rmdir()
- 4. 获取目录中的文件列表
- 4.1 opendir() 打开目录
- 4.2 readdir() 读取目录内容
- 4.3 closedir() 关闭目录
- 5. dirent 结构体
- 6. 示例代码
- (1) 获取当前工作目录
- (2)切换工作目录
- (3)创建和删除目录
- (4)遍历目录中的文件
- (5)结合所有操作的示例
本文将介绍常用的Linux目录操作函数,包括获取当前工作目录、切换工作目录、创建和删除目录等操作。
1. 获取当前工作目录
Linux提供了两个常用函数来获取当前工作目录。
1.1 getcwd()
该函数用于获取当前进程的工作目录,并将路径存储在用户提供的缓冲区中。
函数原型:
char *getcwd(char *buf, size_t size);
buf
:存储当前工作目录路径的缓冲区。size
:缓冲区的大小。
如果成功,返回当前工作目录的路径;如果失败,返回NULL
,并设置errno。
1.2 get_current_dir_name()
这是一个较为简化的函数,不需要传入缓冲区,它会动态分配内存来存储当前目录的路径。
函数原型:
char *get_current_dir_name(void);
调用此函数后,返回的字符串指向当前工作目录的路径,使用完后需要调用free()
来释放内存。
2. 切换工作目录
切换工作目录的操作在文件操作中经常会用到。Linux提供了一个函数chdir()
来实现该操作。
2.1 chdir()
该函数用于改变当前进程的工作目录。
函数原型:
int chdir(const char *path);
path
:目标目录的路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会被设置为具体的错误码(如目录不存在或权限不足)。
3. 创建和删除目录
3.1 mkdir()
用于创建一个新目录。需要提供目录名和访问权限。
函数原型:
int mkdir(const char *pathname, mode_t mode);
pathname
:新目录的路径。mode
:目录权限,通常使用如0755
来设定权限。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置相应的错误。
3.2 rmdir()
用于删除一个空目录。删除时,目录必须为空。
函数原型:
int rmdir(const char *path);
path
:需要删除的目录路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置具体的错误原因(如目录非空)。
4. 获取目录中的文件列表
获取目录中的文件列表通常需要遍历目录。Linux提供了一些API来帮助我们打开、读取和关闭目录。
4.1 opendir() 打开目录
函数原型:
DIR *opendir(const char *pathname);
pathname
:需要打开的目录路径。
返回值:
- 成功:返回
DIR*
,即目录流。 - 失败:返回
NULL
,errno
设置为错误码。
4.2 readdir() 读取目录内容
函数原型:
struct dirent *readdir(DIR *dirp);
dirp
:通过opendir()
获得的目录流。
返回值:
- 成功:返回指向
dirent
结构体的指针,其中包含了当前目录项的信息。 - 失败:返回
NULL
。
4.3 closedir() 关闭目录
函数原型:
int closedir(DIR *dirp);
dirp
:需要关闭的目录流。
返回值:
- 成功:返回0。
- 失败:返回-1。
5. dirent 结构体
在通过readdir()
函数获取目录项时,返回的是一个dirent
结构体,该结构体定义了目录项的相关信息。
结构体定义:
struct dirent {long d_ino; // inode编号off_t d_off; // 偏移量unsigned short d_reclen; // 目录项长度unsigned char d_type; // 文件类型char d_name[NAME_MAX+1]; // 文件名
};
d_name
:存储目录项的文件名,最大长度为255字符。d_type
:文件类型,可能的值包括普通文件(DT_REG
)、目录(DT_DIR
)、符号链接(DT_LNK
)等。
6. 示例代码
(1) 获取当前工作目录
以下示例展示了如何使用getcwd()
和get_current_dir_name()
获取当前工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 使用getcwd()获取当前工作目录char path1[256];if (getcwd(path1, sizeof(path1)) != NULL) {cout << "Current working directory (getcwd): " << path1 << endl;} else {perror("getcwd failed");}// 使用get_current_dir_name()获取当前工作目录char *path2 = get_current_dir_name();if (path2 != NULL) {cout << "Current working directory (get_current_dir_name): " << path2 << endl;free(path2); // 注意释放内存} else {perror("get_current_dir_name failed");}return 0;
}
(2)切换工作目录
示例展示了如何使用chdir()
函数来切换工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 获取当前工作目录char currentDir[256];if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 切换到新的目录if (chdir("/home") == 0) {cout << "Changed working directory to /home" << endl;} else {perror("chdir failed");return 1;}// 获取切换后的工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}return 0;
}
(3)创建和删除目录
以下示例展示了如何使用mkdir()
创建目录和rmdir()
删除空目录:
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "testDir";// 创建目录if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 删除目录if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}
(4)遍历目录中的文件
以下示例展示了如何使用opendir()
, readdir()
, 和 closedir()
来遍历目录中的文件:
#include <iostream>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "/home";// 打开目录DIR *dir = opendir(dirName);if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;// 遍历目录中的文件cout << "Files in directory " << dirName << ":" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 关闭目录closedir(dir);return 0;
}
(5)结合所有操作的示例
以下是一个较为完整的示例,结合了获取当前目录、切换目录、创建目录和遍历目录等操作:
#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {char currentDir[256];// 获取当前工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 创建目录const char *dirName = "exampleDir";if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 切换到新创建的目录if (chdir(dirName) == 0) {cout << "Changed to directory " << dirName << endl;} else {perror("chdir failed");return 1;}// 获取切换后的工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}// 列出当前目录中的文件DIR *dir = opendir(".");if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;cout << "Files in the current directory:" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 关闭目录closedir(dir);// 删除目录if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}
相关文章:
Linux 目录操作详解
Linux目录操作详解 1. 获取当前工作目录1.1 getcwd()1.2 get_current_dir_name() 2. 切换工作目录2.1 chdir() 3. 创建和删除目录3.1 mkdir()3.2 rmdir() 4. 获取目录中的文件列表4.1 opendir() 打开目录4.2 readdir() 读取目录内容4.3 closedir() 关闭目录 5. dirent 结构体6.…...
IMX6ull项目环境配置
文件解压缩: .tar.gz 格式解压为 tar -zxvf .tar.bz2 格式解压为 tar -jxvf 2.4版本后的U-boot.bin移植进SD卡后,通过串口启动配置开发板和虚拟机网络。 setenv ipaddr 192.168.2.230 setenv ethaddr 00:04:9f:…...
redis实现lamp架构缓存
redis服务器环境下mysql实现lamp架构缓存 ip角色环境192.168.242.49缓存服务器Redis2.2.7192.168.242.50mysql服务器mysql192.168.242.51web端php ***默认已安装好redis,mysql 三台服务器时间同步(非常重要) # 下载ntpdate yum -y install…...
与机器学习相关的概率论重要概念的介绍和说明
概率论一些重要概念的介绍和说明 1、 试验 (1)试验是指在特定条件下,对某种方法、技术、设备或产品(即,事物)进行测试或验证的过程。 (2)易混淆的概念是,实验。实验&…...
深度学习 Pytorch 单层神经网络
神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,我们用圆表示神经元,用线表示神经元之间的连接,数据从神经网络的左侧输入,让神经元处理之后,从右…...
常用集合-数据结构-MySql
目录 java核心: 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…...
策略模式 - 策略模式的使用
引言 在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端…...
【贪心算法】在有盾牌的情况下能通过每轮伤害的最小值(亚马逊笔试题)
思路: 采用贪心算法,先计算出来所有的伤害值,然后再计算每轮在使用盾牌的情况下能减少伤害的最大值,最后用总的伤害值减去能减少的最大值就是最少的总伤害值 public static long getMinimumValue(List<Integer> power, int…...
零基础Vue学习1——Vue学习前环境准备
目录 环境准备 创建Vue项目 项目目录说明 后续开发过程中常用命令 环境准备 安装开发工具:vscode、webstorm、idea都可以安装node:V22以上版本即可安装pnpm 不知道怎么安装的可以私信我教你方法 创建Vue项目 本地新建一个文件夹,之后在文件夹下打开…...
小游戏源码开发搭建技术栈和服务器配置流程
近些年各种场景小游戏开发搭建版本层出不穷,山东布谷科技拥有多年海内外小游戏源码开发经验,现为从事小游戏源码开发或游戏运营的朋友们详细介绍小游戏开发及服务器配置流程。 一、可以对接到app的小游戏是如何开发的 1、小游戏源码开发的需求分析: 明…...
【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.3.1. 函数和方法的隐式解引用转化(Deref Coercion) 隐式解引用转化(Deref Coercion)是为…...
SQL-leetcode—1174. 即时食物配送 II
1174. 即时食物配送 II 配送表: Delivery ------------------------------------ | Column Name | Type | ------------------------------------ | delivery_id | int | | customer_id | int | | order_date | date | | customer_pref_delivery_date | date | -------------…...
css3 svg制作404页面动画效果HTML源码
源码介绍 css3 svg制作404页面动画效果HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果 效果预览 源码如下 <!doctype html> <html> <head> <meta charse…...
MATLAB提供的颜色映射表colormap——伪彩色
图像处理领域的一个习惯:不是真实的颜色,一般用伪彩色。一是说明不是物体本身的颜色,二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑,近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…...
2013年蓝桥杯第四届CC++大学B组真题及代码
目录 1A:高斯日记(日期计算) 2B:马虎的算式(暴力模拟) 3C:第39级台阶(dfs或dp) 4D:黄金连分数(递推大数运算) 5E:前缀…...
我的创作纪念日——1/23
机缘 想起写博客,其实是当时看鹏哥C语言时,他说通过写博客的方式来记录自己学习过程,有利于提升自己。尽管我只看了几集就没怎么看,但是写博客的习惯保留下来。 至于为什么,一方面单纯当作单个代码库,把自…...
C# Interlocked 类使用详解
总目录 前言 在多线程编程中,确保多个线程对共享资源的安全访问是一个关键挑战。C# 提供了多种同步机制来处理并发问题,其中 System.Threading.Interlocked 类提供了一种轻量级的方法来进行原子操作。它允许您执行一些常见的增量、减量、交换等操作&…...
SYN Flooding的攻击原理
SYN Flooding是一种常见的网络攻击方式,属于拒绝服务攻击(DoS)的一种,其攻击原理主要是利用了TCP协议的三次握手过程,以下是具体介绍: TCP三次握手正常流程 第一次握手:客户端向服务器发送一个…...
Mono里运行C#脚本35—加载C#语言基类的过程
前面大体地分析了整个Mono运行过程,主要从文件的加载,再到EXE文件的入口点, 然后到方法的编译,机器代码的生成,再到函数调用的跳板转换,进而解析递归地实现JIT。 但是还有很多功能没有解析的,就是C#语言相关最多的,就是类的加载,以及类语言设计的实现属性, 比如类的…...
类包含类 三角分形 面向对象
Cad c# Sj类的构造函数,直接包含电线和三个分形三角形。...
Flutter:搜索页,搜索bar封装
view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...
chrome插件:网页图片高清下载
前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址,点击扩展插件即可进行图片…...
docker 简要笔记
文章目录 一、前提内容1、docker 环境准备2、docker-compose 环境准备3、流程说明 二、打包 docker 镜像1、基础镜像2、国内镜像源3、基础的dockerfile4、打包镜像 四、构建运行1、docker 部分2、docker-compose 部分2.1、构建docker-compose.yml2.1.1、同目录构建2.1.2、利用镜…...
Java I/O 流介绍
Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 编程中,I/O(Input/Output)流是处理输入和输出操作的核心机制。它允许程序与外部设备(如文件、网络连接、键盘、显示器等)进行数据交互。通过使用 I/O 流&…...
C# OpenCV机器视觉:利用CNN实现快速模板匹配
在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面&a…...
数据结构——实验七·排序
欢迎各位大佬们来到Tubishu的博客🌟 Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥 求各位大佬们垂怜🔥点赞评论一下呗🔥🔥 本文专栏 ➡️ 数据结构 …...
Flutter_学习记录_Tab的简单Demo~真的很简单
1. Tab的简单使用了解 要实现tab(选项卡或者标签视图)需要用到三个组件: TabBarTabBarViewTabController 这一块,我也不知道怎么整理了,直接提供代码吧: import package:flutter/material.dart;void main() {runApp(MyApp());…...
const的用法
文章目录 一、C和C中const修饰变量的区别二、const和一级指针的结合const修饰的量常出现的错误是:const和一级指针的结合总结:const和指针的类型转换公式 三、const和二级指针的结合 一、C和C中const修饰变量的区别 C中:const必须初始化,叫常…...
分布式微服务系统简述
distributed microservice 分布式与微服务的定义及关系;分布式微服务架构里的各组件,如:配置中心、服务注册/发现、服务网关、负载均衡器、限流降级、断路器、服务调用、分布式事务等;spring cloud 介绍及实现案例,如…...
Uniapp开发总结
一、tabBar 如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。 pages.json 页面路由 | uni-app官网 pages.json基本配置: "tabBar": {"color": "#000",&quo…...
uniapp APP端页面触发调用webview(页面为uniapp开发的H5)里的方法
原理: 使用 getCurrentInstance() 获取当前组件的 Vue 实例,通过 instance.proxy.$scope.$getAppWebview() 获取 Uniapp 的原生 WebView 对象。 使用 WebView 提供的 evalJS 方法,执行嵌入 H5 页面内的 JavaScript 代码 <template>&l…...
Qt 5.14.2 学习记录 —— 이십 QFile和多线程
文章目录 1、QFile1、打开2、读写3、关闭4、程序5、其它功能 2、多线程1、演示2、锁 3、条件变量和信号量 1、QFile Qt有自己的一套文件体系,不过Qt也可以使用C,C,Linux的文件操作。使用Qt的文件体系和Qt自己的一些类型更好配合。 管理写入读…...
未初始化数据恢复全攻略
没有初始化概述 在日常使用电脑、硬盘、U盘等存储设备时,我们可能会遇到“没有初始化”的提示。这一情况通常发生在存储设备突然无法被系统正常识别或访问时,系统往往要求我们先进行初始化操作。然而,初始化操作意味着对存储设备进行格式化&…...
自动驾驶中的多传感器时间同步
目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…...
三元组抽取在实际应用中如何处理语义模糊性?
在实际应用中,三元组抽取面临语义模糊性的问题,这主要体现在输入文本的非规范描述、复杂句式以及多义性等方面。为了有效处理这种模糊性,研究者们提出了多种方法和技术,以下是一些关键策略: 基于深度学习的方法 深度学…...
代码随想录刷题day16|(哈希表篇)349.两个数组的交集
目录 一、哈希表理论基础 二、集合set在哈希法中的应用 三、相关算法题目 四、相关知识点 1.set集合特点和常用方法 1.1 set集合概述 1.2 set集合特点 1.3 常用方法 2.set集合转换成数组 法1:另新建一个数组 法2:将结果集合转为数组 ▲ 3.数组…...
浅谈Redis
2007 年,一位程序员和朋友一起创建了一个网站。为了解决这个网站的负载问题,他自己定制了一个数据库。于2009 年开发,称之为Redis。这位意大利程序员是萨尔瓦托勒桑菲利波(Salvatore Sanfilippo),他被称为Redis之父,更…...
整数的个数(信息学奥赛一本通-1067)
【题目描述】 给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数k,第二行包含k个正整数…...
macos的图标过大,这是因为有自己的设计规范
苹果官方链接:App 图标 | Apple Developer Documentation 这个在官方文档里有说明,并且提供了sketch 和 ps 的模板。 figma还提供了模板: Figma...
C++17 命名空间的新特性:简化与优化的典范
文章目录 1. 简化的嵌套命名空间1.1 背景与问题1.2 C17的解决方案1.3 实际应用场景1.4 注意事项 2. 声明多个名称的using声明2.1 背景与问题2.2 C17的解决方案2.3 实际应用场景2.4 注意事项 3. 属性命名空间的简化3.1 背景与问题3.2 C17的解决方案3.3 实际应用场景3.4 注意事项…...
使用python-docx包进行多文件word文字、字符批量替换
1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字,安装。 4、新建py文件,写程序。 from docx import Documentdef replace1(array1):# 替换词典(标签值按实际情况修改)dic {替换词1: array1[0], 替换…...
模块初阶学习
当我们在过去想要实现一个功能时,例如Swap交换函数时,我们需要不断考虑参数的正确与否。如果是在c语言,我们还需要不断更改函数名字,以防止函数名重复。在c我们可以通过函数名重载解决这个问题,但还是有一些小问题&…...
华为 Ascend 平台 YOLOv5 目标检测推理教程
1. 背景介绍 随着人工智能技术的快速发展,目标检测在智能安防、自动驾驶、工业检测等领域中扮演了重要角色。YOLOv5 是一种高效的目标检测模型,凭借其速度和精度的平衡广受欢迎。 华为 Ascend 推理框架(ACL)是 Ascend CANN 软件…...
16.好数python解法——2024年省赛蓝桥杯真题
问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …...
在WSL使用gnome终端
默认在windows11环境下使用WSL会打开windows终端,如果想要使用gnome终端可以进行如下操作 确保 WSLg 已启用: WSLg 默认在 Windows 11 和最新版本的 WSL 2 中启用。 检查 WSL 版本: wsl --list --verbose 如果未启用 WSLg,请更…...
评估篇| 大模型评测综述
在传统的自然语言任务下,如分类等,经常会用精确率、F1等指标,来评测模型的好坏。随着大模型技术研究的快速发展,以往的指标,对于大模型评估显得过于单薄。如何准确地评估大语言模型在不同维度的能力水平,已经成为当前研究的热点问题。为了全面考察大语言模型的有效性,研…...
Ubuntu下载zenodo文件Ubuntu download zenodo
一般数据集文件会比较大,直接下载单个压缩包很慢。可以使用代码多线程下载小文件。 环境 Ubuntu22.04 示例代码 pip3 install zenodo_get zenodo_get https://zenodo.org/records/13715870参考 https://github.com/dvolgyes/zenodo_get...
OpenHarmony 5.0.2 Release来了!
版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善,以快速迭代的方式推出API 14,相比5.0.1 Release版本,重点做出了如下特性新增或增强: 进一步增强ArkUI、图形图像的能力,提供更多组件的高级属性…...
蓝桥杯3519 填充 | 分类讨论
题目传送门 很简单,遍历一次字符串,将‘?’作为0或1处理,发现00和11统计次数即可。 s str(input()) cnt 0 arr [00, 11, 0?, ?0, 1?, ?1, ??] i0 while i < len(s)-1:if s[i:(i2)] in arr:i 2cnt 1else:i 1 print(cnt)END✨...
均值(信息学奥赛一本通-1060)
【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的…...