为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

枝wenz_fpJNR0 的学生作业:

1 //使用 Linux 文件 io 接口实现 文件复制 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 #define BUF_SIZE 1024 //缓冲区大小 11 12 int main(int argc, const char *argv[]) 13 { 14 int fd_src,fd_dst;//fd_src源文件描述符,fd_dst目标文件描述符 15 char buf[BUF_SIZE];//数据缓冲区;临时存储读取的内容 16 ssize_t n_read; // 实际读取的字节数(ssize_t是有符号的size_t,兼容-1错误返回) 17 18 //argc(argument count):表示命令行参数的个数(包括程序名本身)。 19 //argv(argument vector):是字符串数组,存储具体的命令行参数,argv[0] 是程序名,argv[1] 是第一个用户传入的参数。 20 // 1. 参数校验:需要传入 源文件路径 + 目标文件路径 两个参数 21 if(argc != 3) 22 { 23 fprintf(stderr,"Usage: \n",argv[0]); 24 return -1; 25 } 26 //打开函数int open(const char *pathname, int flags, mode_t mode); 27 //pathname : 文件路径名 28 //flags : 打开标志 29 //O_RDONLY:只读方式打开文件 30 //O_WRONLY:可写方式打开文件 31 //O_RDWR:读写方式打开文件 32 //O_CREAT:如果该文件不存在就创建一个新的文件,并用第三的参数为其设置权限 33 //O_EXCL:如果使用O_CRATE时文件存在,open()报错 34 //O_TRUNC:如果文件已经存在,并且以读/写或只写成功打开,并清零 35 //O_APPEND:以添加的方式打开文件,在打开文件的同时,文件指针指向文件末尾 36 //2. 打开源文件(只读模式) 37 fd_src = open(argv[1],O_RDONLY); 38 //判断源文件打开是否成功 39 if(fd_src==-1){ 40 perror("Open源文件失败!"); 41 return -1; 42 } 43 // 3. 打开/创建目标文件(只写模式,不存在则创建,存在则清空) 44 // O_WRONLY:只写 | O_CREAT:不存在则创建 | O_TRUNC:存在则清空内容 45 // 0644:文件权限(所有者可读可写,其他只读,八进制) 46 fd_dst=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); 47 if(fd_dst==-1){ 48 perror("创建目标文件失败!"); 49 close(fd_src);// 源文件已打开,失败时要先关闭,避免资源泄漏 50 return -1; 51 } 52 // 4. 循环读取源文件 → 写入目标文件 53 // 核心逻辑:read返回0表示文件读完,返回-1表示出错 54 while((n_read=read(fd_src,buf,BUF_SIZE))>0){ 55 //将读取到的n_read字节写入目标文件 56 ssize_t n_write=write(fd_dst,buf,n_read); 57 if(n_write==-1){ 58 perror("写入目标文件失败!"); 59 close(fd_src); 60 close(fd_dst); 61 return -1; 62 } 63 } 64 // 5. 检查read是否出错(如果n_read == -1) 65 if(n_read==-1){ 66 perror("读取源文件失败!"); 67 close(fd_src); 68 close(fd_dst); 69 return -1; 70 } 71 // 6. 关闭所有文件描述符(必须做,释放内核资源) 72 close(fd_src); 73 close(fd_dst); 74 75 printf("文件复制成功!\n"); 76 return 0; 77 }

得分 92
学习任务

奋斗中的小沫 的学生作业:

【服务端】 /* 需求:编写服务端,接收客户端发送请求,提取其中两个整型数据,相加后将结果响应回客户端 步骤: 1.包含头文件 2.初始化 ROS2 客户端 3.定义节点类 3-1.创建服务端 3-2.回调函数处理请求数据并响应结果 4.调用spin函数,并传入节点对象指针 5.释放资源 6.执行 ros2 service call /add_ints base_interfaces_demo/srv/AddInts "{'num1': 10, 'num2': 20}" 进行测试 */ // 1.包含头文件 #include "rclcpp/rclcpp.hpp" #include "base_interfaces_demo/srv/add_ints.hpp" using base_interfaces_demo::srv::AddInts; using std::placeholders::_1; using std::placeholders::_2; // 3.定义节点类 class AddIntsServer : public rclcpp::Node { public: AddIntsServer() : Node("add_ints_server_node_cpp") { RCLCPP_INFO(this->get_logger(), "服务端节点创建!"); // 3-1.创建服务端 /* 模板:服务接口类型 参数: 1.服务话题 2.回调函数 返回值:服务对象指针 */ server_ = this->create_service("add_ints", std::bind(&AddIntsServer::add, this, _1, _2)); } private: rclcpp::Service::SharedPtr server_; void add(const AddInts::Request::SharedPtr req, const AddInts::Response::SharedPtr res) { // 3-2.回调函数处理请求数据并响应结果 res->num = req->num1 + req->num2; RCLCPP_INFO(this->get_logger(), "%d + %d = %d", req->num1, req->num2, res->num); } }; int main(int argc, char const *argv[]) { // 2.初始化 ROS2 客户端 rclcpp::init(argc, argv); // 调用spin函数,并传入节点对象指针 rclcpp::spin(std::make_shared()); // 5.释放资源 rclcpp::shutdown(); return 0; } 【客户端】 /* 需求:编写客户端,发送两个整型变量作为请求数据,并处理响应结果 步骤: 前提:main函数中,需要判断提交的参数是否正确 1.包含头文件 2.初始化 ROS2 客户端 3.定义节点类 3-1.创建客户端 3-2.等待服务连接 3-3.组织请求数据并发送 4.创建对象指针 5.释放资源 */ // 1.包含头文件 #include "rclcpp/rclcpp.hpp" #include "base_interfaces_demo/srv/add_ints.hpp" using base_interfaces_demo::srv::AddInts; using namespace std::chrono_literals; // 3.定义节点类 class AddIntsClient : public rclcpp::Node { public: AddIntsClient() : Node("add_ints_client_node_cpp") { RCLCPP_INFO(this->get_logger(), "客户端节点创建!"); // 3-1.创建客户端 /* 模板:服务接口 参数:服务话题名称 返回值:服务对象指针 */ client_ = this->create_client("add_ints"); } // 3-2.等待服务连接 /* 连接成功返回true,失败返回false */ bool connect_server() { size_t count = 0; while (!client_->wait_for_service(3s)) { // 对按键 ctr+c 操作进行处理 // 判断是否按下 if (!rclcpp::ok()) { RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "强行终止客户端!"); return false; } RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "服务器连接中..."); count++; if (count > 30) { break; } } return true; } // 3-3.组织请求数据并发送 /* 返回对象类型:rclcpp::Client::FutureAndRequestId 函数原型:rclcpp::Client::async_send_request(ServiceT::Request::SharedPtr request) */ rclcpp::Client::FutureAndRequestId send_request(int num1, int num2) { auto request = std::make_shared(); request->num1 = num1; request->num2 = num2; return client_->async_send_request(request); } private: rclcpp::Client::SharedPtr client_; }; int main(int argc, char const *argv[]) { if (argc != 3) { /* rclcpp::get_logger("log_name") 创建logger对象不依赖于context */ RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "请提交两个整型数字!"); return 1; } // 2.初始化 ROS2 客户端 rclcpp::init(argc, argv); // 4.创建客户端对象 auto client = std::make_shared(); // 客户端对象调用方法连接服务器 bool flag = client->connect_server(); if (!flag) { RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "连接服务器失败,退出函数!"); return 0; } // 调用请求提交函数,接收返回结果 auto future = client->send_request(atoi(argv[1]), atoi(argv[2])); // 处理返回结果 if (rclcpp::spin_until_future_complete(client, future) == rclcpp::FutureReturnCode::SUCCESS) // 成功 { RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "响应成功: num = %d", future.get()->num); } else // 失败 { RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "响应失败!"); } // 5.释放资源 rclcpp::shutdown(); return 0; } 【运行结果】【图片】

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号