练习1.16

编程:从文本中一行一行的字符,读完之后,将最长的行打印出来。要求能打印任意长度的行。

 

注:将最长行保存案后打印任意长度的输入行是不可能的!!!因为在读取完整个文本之后,最长的输入行是保存在一个字符数组中的,而字符数组是有长度的,他不可能无限长,这里作者的意思我不明白。

这个程序一行最多能够读取1023个字符,如果超过1023还没有遇到回车('\n')或者字符串结束符('\0'),那么下面的字符将作为下一行。

 

如果真正要做到输出最长的一行,也不是不可以做到!!!我可以在程序返回的时候,获得一个那个最长行在文件的位置信息,然后打印的时候,重新去访问文件。。到我觉得这不是作者的意思。。参考答案上也不是这样做的。。。并且这样做仅仅对于文本文件的输入有作用,对于实时的交互(例如从控制终端输入)就不能在输入完成之后在获得输入文件数据的相关信息了。。

 

程序流程图如下:

 

 

getline函数的流程图如下:

 

 

整个程序的代码如下:

 

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

#define MAXLINE 1024
size_t getline(FILE *fin, char *line, size_t maxlen);
void displayLine(FILE *fout, char *line);

int main(int argc, char *argv[])
{
    char currLine[MAXLINE] = "";
    char maxLine[MAXLINE] = "";
    size_t currLen = 0;
    size_t maxLen = 0;
    FILE *fp = fopen("main.c", "r");
    while ((currLen = getline(fp, currLine, MAXLINE)) != EOF) {
  //     printf("%ld\n", currLen);
  //     printf("%s", currLine);
  //     getchar();
        if (currLen > maxLen) {
            maxLen = currLen;
            strcpy(maxLine, currLine);
        }
    }
    if (maxLen != 0) {
        displayLine(stdout, maxLine);
    }
    return 0;
}


size_t getline(FILE *fin, char *line, size_t maxlen)
{
    int c = 0;
    size_t i = 0;

    while (i < maxlen) {
        c = fgetc(fin);
        if (i == 0 && c == EOF) return EOF;
        switch (c) {
            case '\n':
                {
                    line[i] = '\n';
                    line[i+1] = '\0';
                }
                return i+1;
            case '\0':
              //      line[i] = '\0';
              //      break;
            case EOF:
                    line[i] = '\0';
                     return i+1;
            default:
                line[i++] = c;
        }
    }
}

void displayLine(FILE *fout, char *line)
{
    size_t i = 0;
    while (line[i] != '\0') {
        fputc(line[i++], fout);
    }
}

 

汗啊。。这么久才写这么几个程序。。。还是这样的程序。。。
 

 

<think>好的,用户想了解如何练习Docker。首先,我需要考虑用户的背景。他们可能已经有一些编程或系统管理的基础,但对Docker还不熟悉。用户提到“练习”,所以需要实际操作步骤,而不仅仅是理论。 首先,应该从Docker的基本概念开始,比如容器、镜像、Dockerfile、Docker Compose等。但用户可能需要先安装Docker,所以第一步应该指导他们如何安装。不同操作系统的安装方法不同,需要分别说明,比如在Ubuntu、CentOS、macOS和Windows上的步骤。 接下来,用户需要一些简单的命令来验证安装是否成功,比如docker --version和docker run hello-world。这能确保他们的环境正确配置。 然后是基础操作练习。运行一个Nginx容器作为例子,这样用户可以立即看到效果,比如访问本地端口。接着,管理容器的命令,如查看运行中的容器、停止、删除等,这些是日常使用中必须掌握的。 之后,构建自定义镜像部分。用户需要了解Dockerfile的基本结构,比如FROM、COPY、RUN、CMD等指令。通过一个简单的Python应用示例,他们可以学习如何创建镜像并运行。这部分需要强调分层构建和缓存机制,帮助优化镜像大小和构建速度。 数据持久化是一个重要但容易忽略的部分。用户需要理解容器是临时的,所以卷和挂载主机目录的方法能帮助他们保存数据。示例中使用MySQL和挂载目录来说明,这样数据不会随容器删除而丢失。 网络配置方面,自定义网络和容器互联是常见需求。通过创建网络并运行多个容器,用户可以学习如何让容器之间通信,比如应用连接数据库。 Docker Compose部分对于管理多容器应用非常有用。提供一个docker-compose.yml的示例,展示如何定义服务、卷和网络,简化部署流程。 高级主题部分可以稍微深入,比如多阶段构建优化镜像,使用Docker Swarm或Kubernetes进行编排,监控和日志管理。这些内容为用户进一步学习提供方向。 最后,推荐资源帮助用户自主学习,包括官方文档、互动教程、视频课程和项目实践。同时,强调练习的重要性,建议从简单到复杂逐步深入,参与社区解决问题。 整体结构需要清晰,步骤分明,每个部分都有示例命令和解释,确保用户能跟着操作。同时注意使用正确的LaTeX格式,但根据用户要求,数学表达式可能较少,主要是在需要时正确应用。还要用中文,保持口语化,避免技术术语过于密集,适当分段落和列表,提高可读性。</think>以下是为您整理的Docker学习路径和练习建议,分步骤帮助您系统掌握容器化技术: --- ### 一、准备工作 1. **安装Docker** - Ubuntu: ```bash sudo apt-get update && sudo apt-get install docker.io ``` - CentOS: ```bash sudo yum install docker && sudo systemctl start docker ``` - macOS/Windows: 下载 [Docker Desktop](https://www.docker.com/products/docker-desktop) 2. **验证安装** ```bash docker --version # 输出版本信息 docker run hello-world # 运行测试容器 ``` --- ### 二、基础操作练习 1. **运行第一个容器** ```bash docker run -d -p 80:80 --name my-nginx nginx # 启动Nginx容器 ``` - 访问 `http://localhost` 查看效果 2. **容器生命周期管理** ```bash docker ps -a # 查看所有容器 docker stop my-nginx # 停止容器 docker rm my-nginx # 删除容器 docker rmi nginx # 删除镜像 ``` --- ### 三、构建自定义镜像 1. **创建Dockerfile** ```dockerfile FROM python:3.9-slim COPY app.py /app/ WORKDIR /app RUN pip install flask CMD ["python", "app.py"] ``` 2. **构建并运行镜像** ```bash docker build -t my-flask-app . # 构建镜像 docker run -d -p 5000:5000 my-flask-app # 运行容器 ``` --- ### 四、数据持久化 1. **使用数据卷** ```bash docker volume create my-data # 创建卷 docker run -v my-data:/data mysql # 挂载卷 ``` 2. **挂载主机目录** ```bash docker run -v /host/path:/container/path nginx ``` --- ### 五、网络配置 1. **创建自定义网络** ```bash docker network create my-network ``` 2. **容器互联** ```bash docker run -d --name db --network my-network mysql docker run -d --name app --network my-network my-flask-app ``` --- ### 六、Docker Compose实战 1. **编写`docker-compose.yml`** ```yaml version: '3' services: web: build: . ports: ["5000:5000"] db: image: mysql volumes: ["db-data:/var/lib/mysql"] volumes: db-data: ``` 2. **启动服务栈** ```bash docker-compose up -d ``` --- ### 七、高级进阶练习 1. **多阶段构建** ```dockerfile # 构建阶段 FROM golang:1.16 AS builder COPY . . RUN go build -o /app # 运行阶段 FROM alpine:latest COPY --from=builder /app /app CMD ["/app"] ``` 2. **容器编排** - 尝试 Docker Swarm 或 Kubernetes 部署多节点应用 --- ### 八、学习资源推荐 1. 官方文档:[docs.docker.com](https://docs.docker.com/) 2. 交互式实验室:[Play with Docker](https://labs.play-with-docker.com/) 3. 视频课程:B站搜索"Docker入门到精通" 4. 实战项目:部署WordPress、Jenkins等完整应用栈 --- 通过以上分阶段练习,您将从基础操作逐步过渡到实际项目部署。建议从单容器应用开始,逐步尝试多服务协作,最终掌握生产级部署技巧。遇到问题时,善用`docker logs`查看日志,多参与[Docker社区](https://forums.docker.com/)交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值