用标准IO 实现“head -n 文件名”命令的功能

目录

题目

思想

代码


题目

实现“head -n 文件名”命令的功能

思路

思路:循环读,读到就累加行数,并且打印到终端,判断是否达到最后一行,达到就退出。

实现“head -n 文件名”命令的功能

例:head -3 test.c -> ./a.out -3 test.c

atoi: "123" -> 123(整型)

argv[1]: "-3" 的首地址

argv[1]+1: "3" 的首地址

atoi(argv[1]+1) ==> 3

  1. 首先检查命令行参数的数量。如果不是 3 个,即没有按照指定格式(./a.out -n <filename>)输入,通过 printf 输出错误提示信息并返回 -1 结束程序。

  2. 使用 fopen 函数以只读模式打开指定的文件名(argv[2])。如果打开失败(返回 NULL ),通过 perror 输出错误信息并返回 -1 结束程序。

  3. 通过 atoi(argv[1] + 1) 将命令行参数中紧跟 - 后的数字部分转换为整数,存储在 num 中,用于指定要打印的行数。

  4. 定义字符数组 buf 用于存储每次读取的内容,以及整数 len 用于记录已读取的行数。

  5. 使用 while 循环通过 fgets 从文件中读取内容到 buf 中。在每次读取后,如果读取到的内容以换行符结尾(通过检查 buf[strlen(buf) - 1] == '\n'),则将行数 len 加 1 。

  6. 如果已读取的行数 len 超过指定的行数 num ,就通过 break 退出循环。

  7. 在循环中,使用 fputs 将每次读取到的内容打印到标准输出(终端)。

  8. 循环结束后,使用 fclose 关闭文件,释放相关资源。

 

总的来说,这段代码的目的是根据命令行指定的行数,从文件中读取并打印相应数量的行到终端

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        printf("err: %s -n <filename>\n", argv[0]); //./a.out -n <filename>
        return -1;
    }

    FILE *fp = fopen(argv[2], "r");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }

    //获取行数
    int num = atoi(argv[1] + 1); // +1是为了向后偏移一个地址单位把-去掉获取到要打印的行数

    char buf[32] = "";
    int len = 0;

    //循环读,然后数换行,打印到终端,如果是最后一行就退出
    while (fgets(buf, 32, fp) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')     //数换行
            len++;

        if (len > num)    //达到行数就退出
            break;

        fputs(buf, stdout); //打印内容到终端
    }
    fclose(fp);
    return 0;
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是实现基于 Servlet3.x 多文件上传功能的步骤: 1. 首先,在 web.xml 文件中配置一个 MultipartConfig,用于处理多文件上传请求。具体配置方式如下: ```xml <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.example.UploadServlet</servlet-class> <multipart-config> <!-- 最大文件大小 --> <max-file-size>10485760</max-file-size> <!-- 最大请求大小 --> <max-request-size>20971520</max-request-size> <!-- 内存缓存大小 --> <file-size-threshold>5242880</file-size-threshold> </multipart-config> </servlet> ``` 上面的代码中,max-file-size 表示最大的文件大小,单位为字节;max-request-size 表示最大的请求大小,包括所有文件和表单数据,单位为字节;file-size-threshold 表示内存缓存大小,超过该大小的文件将被写入磁盘。需要根据实际需求进行配置。 2. 在 UploadServlet 类中编写 doPost 方法,用于处理上传文件请求。具体代码如下: ```java import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.annotation.*; import javax.servlet.http.*; @MultipartConfig @WebServlet("/upload") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String savePath = "D:/uploads"; File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } String fileName = ""; for (Part part : request.getParts()) { if (part.getName().equals("file")) { fileName = extractFileName(part); part.write(savePath + File.separator + fileName); } } response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("文件 " + fileName + " 上传成功!"); } private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";"); for (String item : items) { if (item.trim().startsWith("filename")) { return item.substring(item.indexOf("=") + 2, item.length() - 1); } } return ""; } } ``` 上面的代码中,我们首先获取上传文件的保存路径,然后遍历所有的 Part,找到名字为 file 的 Part,从中提取出文件名,并写入指定的保存路径。最后,返回一个上传成功的消息。 需要注意的是,我们需要在 UploadServlet 类上添加 @MultipartConfig 注解,指定 multipart/form-data 请求的处理方式。 3. 编写上传文件的表单页面。具体代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="上传"> </form> </body> </html> ``` 上面的代码中,我们通过 enctype="multipart/form-data" 属性来指定表单的提交方式为 multipart/form-data,然后添加一个文件选择框和一个提交按钮。当用户点击提交按钮时,将会向 UploadServlet 发送一个包含文件数据的 POST 请求。 至此,基于 Servlet3.x 的多文件上传功能实现了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值