C:修改文件以从外部文件读取

2024-02-19

我正在努力通过C 编程语言 - 第二版,尝试通过例子进行推理。我对 C 是个新手。

第一章中的大部分示例代码依赖于getchar()接收输入。例如,以下代码返回文本块的最长行:

#include <stdio.h>

#define     MAXLINE 1000

int max;
char line[MAXLINE];
char longest[MAXLINE];

int getline(void);
void copy(void);

int main()
{  
    int len;
    extern int max;
    extern char longest[];

    max = 0;
    while ((len = getline()) > 0)
        if (len > max) {
            max = len;
            copy();
        }
    if (max > 0)
        printf("%s", longest);
    return 0;        
}

int getline(void) {
    int c, i;
    extern char line[];

    for (i = 0; i < MAXLINE-1 && (c=getchar()) != EOF && c != '\n'; ++i)
        line[i] = c;
    
    if (c == '\n') {
        line[i] = c;
        ++i;
    }
    line[i] = '\0';
    return i;
}

void copy(void) {
    int i;
    extern char line[], longest[];

    i=0;
    while ((longest[i] = line[i]) != '\0')
        ++i
}

可能是一个简单的答案,但是我必须做什么才能提供外部文本文件作为该程序的输入?

编辑:我已尝试以下操作,但出现编译错误:

#include <stdio.h>

#define     MAXLINE 1000

int max;
char line[MAXLINE];
char longest[MAXLINE];
FILE *fp; 

int getline(void);
void copy(void);

int main()
{  
    int len;
    extern int max;
    extern char longest[];
    fp = fopen("./hello.txt", "r");

    max = 0;
    while ((len = getline()) > 0)
        if (len > max) {
            max = len;
            copy();
        }
    if (max > 0)
        printf("%s", longest);
    
    fclose(fp);
    return 0;        
}

int getline(void) {
    int c, i;
    extern char line[];
    extern FILE *fp;

    for (i = 0; i < MAXLINE-1 && (c=fgetc(fp)) != EOF && c != '\n'; ++i)
        line[i] = c;
    
    if (c == '\n') {
        line[i] = c;
        ++i;
    }
    line[i] = '\0';
    return i;
}

void copy(void) {
    int i;
    extern char line[], longest[];

    i=0;
    while ((longest[i] = line[i]) != '\0')
        ++i;
}

fopen("./hello.txt", "r");打开并缓冲名为“./hello.txt”的文件以供读取。

除非你的文件确实是以./(不是/文件名在 UNIX 等中非法?),你应该去除./来自您作为文件名传递的字符串文字。


编译错误在您发布的“原始”代码中是:

  1. getline()不可能真的是重新定义如果你包括stdio.h在某些平台上,例如 MacOS,因为它在那里定义/声明为:

ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream)

基本上,rename getline()对于一些微不足道的东西,比如getln().

或者,通过添加-stdC99编译期间参数的选项。

This seems至少在 C 中是非标准的,也许在 C++ 中不是,但这就是 MacOS 上的情况stdio.h.

To be precise,版本 10.14.6,第 359 行/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h

  1. A missing ; after ++i@第 50 行第 12 栏。

此外,与 C 等语言中的大多数 I/O 一样,您的程序是缺少一些基本的错误检查- 非常重要,例如,检查fp == NULL以防万一fopen()失败,例如如果 hello.txt 不存在,就会发生这种情况,这会很糟糕,因为fclose(NULL)是一个段错误。

当您学习 C 中的(流级)文件 I/O 时,也许随后您就会理解这一点。

如果你还没有达到学习的水平stdio.h基于文件 I/O 还没有,为什么不直接使用更方便的功能从控制台重定向输入? 做就是了hello.txt > ./yourprogram or hello.txt | ./yourprogram从终端运行原始教科书代码时。

适用于基于 UNIX 的系统,甚至 Windows 和 DOS,并且通常用于不值得直接实现文件 I/O 的痛苦的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C:修改文件以从外部文件读取 的相关文章

  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 如何仅在用户运行 Linux 时使用特定字体?

    有没有办法使用 JQuery 或 CSS 检测操作系统 对于 CSS 我指的是类似的东西 我只需要在使用 Linux 查看网页时使用特定字体 并且不想将其包含在其他操作系统中 examine navigator userAgent 通常 您
  • 即使使用 SwingWorker,Java GUI 也会冻结

    我正在尝试使用 SwingWorker 执行一项冗长的任务并使用结果更新 JLabel button addActionListener new ActionListener Override public void actionPerfo
  • 它的输出是什么?为什么?

    我正在检查范围规则问题和所有问题 然后得到一个代码片段 如下 include
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 使用脚本中介获取 JavaScript 中的属性值

    当属性的范围不同于 default 时 有没有办法在 WSO2 ESB 的脚本中介器的 javascript 代码中获取该属性的值 如果属性具有默认范围 get property MyProperty OR 如果属性具有 运输 范围 get
  • 如何对 pandas 中的时间序列数据进行下采样?

    我在 pandas 中有一个时间序列 如下所示 按 id 排序 id time value 1 0 2 1 1 4 1 2 5 1 3 10 1 4 15 1 5 16 1 6 18 1 7 20 2 15 3 2 16 5 2 17 8
  • 有没有一种Pythonic方法可以将标量和0d数组更改为1d数组?

    例如 如果 a 小于 5 我想将 a 更改为 0 def foo a return 0 if a lt 5 else a 为了使其适用于 numpy 数组 我将其更改为 def foo2 a a a lt 5 0 return a 问题是我
  • 使用 .html 文件作为 JSP

    这可能是一个愚蠢的问题 但我在谷歌搜索时没有找到答案 目前 我将请求从 someFileName html 映射到 servlet 然后使用 web xml 中的 servlet 映射转发到 someFileName jsp 我想避免这种情
  • 将 yyyymmdd 字符串转换为 R 中的 Date 类

    我想将这些格式为 YYYYMMDD 的日期转换为 Date 类 dates lt data frame Date c 20130707 20130706 20130705 20130704 I tried dates lt as Date
  • XNA 抽签:在整个游戏中使用一个 spritebatch

    我正在开发一款 XNA 游戏 现在是我仔细考虑架构的时候了 直到今天 我一直以这种方式实现我自己的绘制方法 public void Draw SpriteBatch sb GameTime gameTime sb Begin to draw
  • 在 Visual Studio 中配置 mex 函数

    In here http msdn microsoft com en us library ms182372 aspx解释了如何在 Visual Studio 中分析 exe 文件 有没有办法使用相同的过程来分析墨西哥代码 Thanks 你
  • 如何检测精灵套件中的碰撞?

    我正在 Sprite Kit 中制作游戏 但我在 SpriteNode 之间的碰撞检测方面遇到了困难 我设置了一个名为 sprite 的精灵节点和一个名为 platform 的精灵节点 我希望精灵在与平台碰撞时停止掉落 这就是我所拥有的 S
  • 使用 Matlab 绘制 3D RGB 立方体模型

    我编写了这段代码来绘制 RGB 立方体 但它的颜色并不完全准确 Define a six row by four column matrix to define the six cube faces fm 1 2 6 5 2 3 7 6 3
  • onbeforeunload 事件上的 jQuery.ajax 不起作用

    我有一个像这样的 php 页面 I am creating lo
  • 使用Qt编译测试程序时出错

    我对 C Qt 还很陌生 我正在关注 Jasmin Blanchette 和 Mark Summerfield 所著的 使用 Qt 4 进行 C GUI 编程 一书 我正在编写一个示例程序 并遇到了一些无法解决的编译错误 下面的代码和错误
  • MongoDB:更新文档中的字典

    我有一个 MongoDB 文档 用于保存字典中出现的某些内容 id 1 occurrences 1 1 2 5 17 1 35 4 我现在想要添加或更新一些条目 例如向出现的次数添加 12 3 或者将 17 的出现次数更新为 2 所以假设我
  • C# 正则表达式匹配方括号

    我尝试在 C 中使用正则表达式来匹配可以包含以下内容的软件版本号 2 位数字 1 或 2 位数字 不以 0 开头 另一个 1 或 2 位数字 不以 0 开头 1 2 3 4 或 5 位数字 不以 0 开头 末尾有一个选项字母 括在方括号中
  • 将设计身份验证合并到现有的用户结构中?

    我有一个功能齐全的身份验证系统 其中的用户表有超过五十列 它很简单 但它使用盐进行哈希加密 使用电子邮件而不是用户名 并且还有两种不同类型的用户和管理员 我希望将 Devise 身份验证合并到我的应用程序中 以增强额外的部分 例如电子邮件验
  • gcc 如何在特定平台上获得每种类型的对齐方式?

    它是硬编码到 gcc 的源代码中还是以编程方式获取 我认为它是硬编码在特定于 arch 的文件夹中的 例如对于sparc http www google com codesearch Yj7Hz1ZInUg trunk gcc 4 2 1
  • C:修改文件以从外部文件读取

    我正在努力通过C 编程语言 第二版 尝试通过例子进行推理 我对 C 是个新手 第一章中的大部分示例代码依赖于getchar 接收输入 例如 以下代码返回文本块的最长行 include