C 中未读取整个文件(EOF 意外发生)

2023-12-02

我正在尝试打印大约 4000 个字符的文件内容。 不知何故,程序仅记录前 220 个字符并终止。

int main(void)
{
    char ch = ' ', file_name[25], payload[3904];
    FILE *fp;
    printf("Enter the name of file you wish to see\n");
    gets(file_name);
    fp = fopen(file_name, "r"); // read mode
    if (fp == NULL)
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    printf("The contents of %s file are :\n", file_name);

    int gin = 0;
    while ((ch = fgetc(fp)!=EOF))
    {
        printf("%d) %x \n",gin, ch);
        payload[gin++] = ch;
    }
    printf("Also, value of gin is %d --->", gin);
    getchar();

    //...rest of the code
}

这里的值是gin is 220.

只是为了检查,我修改了while()针对文件中的确切字符数运行的条件:

{
 //...

 while (gin<3904)
 {
    if ((ch = fgetc(fp)) == EOF) res++;//ADDED THIS TO COUNT NUMBER OF EOF's
    printf("%d) %x \n",gin, ch);
    payload[gin++] = ch;
    //printf(" %x \n", payload[(gin - 1)]);

    if (gin % 100 == 0)     
    {
        printf("Also, value of res is %d --->", res); getchar();
        getchar();
    }
 }

 //...rest of the code
}

gin 的值达到 3904,res(EOF 的数量)的值是 3684,这意味着前 220 之后的每个字符都将被读取为 EOF。程序开始读取FF在第一个 220 个字符之后,即使它已被填充。


我认为代码很好,除了您应该更改ch to int.

fgetc() returns

  • 如果成功的话,“字符读取为无符号字符强制转换为int"
  • 在失败中,"EOF在文件末尾或错误”

所以,首先,你必须改变ch to int,因为一些返回值来自fgetc()不得fit into a char.

现在,在第二种情况下,您没有检查返回值fgetc()反对EOF检测任何错误。您只需获取返回值并尝试将这些值存储到数组中。实际上,当到达文件末尾时,不再需要读取任何内容,并且对同一文件指针的所有进一步读取都会返回错误。

这些值很可能是这样的。后220你的情况是valid,根本。

所以,对于你问题中的陈述,

(EOF意外发生)

是错的。它发生得很好,你忽略它并遇到,好吧,trouble.


Note:

  1. 在你的第一个片段中,你连续做了两个fgetc()调用,本质上丢弃第一个结果,并在不进行任何检查的情况下使用第二个结果。
  2. 切勿使用gets()。它存在缓冲区溢出问题。总是使用fgets()反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中未读取整个文件(EOF 意外发生) 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 在没有EOF的情况下停止读取java中的输入

    In 问题 如何停止读取输入 我的程序继续运行 要求更多输入 public static void main String args throws Exception BufferedReader br new BufferedReader
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • Php 中的 IMAP:将消息标记为未读/未见

    我想在 php 中创建一个脚本来从邮件帐户读取所有邮件 我连接到服务器 我可以看到邮件 但我想将其设置回不可见状态 但找不到执行此操作的功能 如果我正确理解此页面 http www php net manual en function im
  • 如何绘制 pandas 计数的分组条形图

    我有一个包含以下列的数据框 gender class male A female A male B female B male B female A 我想绘制一个双条形图 其中列作为每个性别 值分别作为 A 类和 B 类中每种性别的数量 因
  • 如何使用asp.net获取负载均衡机上的访客IP

    我们有两个负载平衡服务器 我们现在托管了一个 asp net 3 5 应用程序 我们正在使用请求 userhostaddress 来获取访问者 ip 但它提供的是负载均衡器 ip 而不是真实 ip 任何人都可以有这方面的代码吗 我认为您不仅
  • xhr send - 发送文件和 CSRF 令牌

    我正在尝试使用 XMLHttpRequest 将文件对象和字符串 CSRF 令牌 发送到服务器 但我似乎无法弄清楚如何添加令牌 xhr open POST form action true xhr setRequestHeader X FI
  • 修改构建的 Jenkins 描述

    我想remotely更改 Jenkins 构建描述 我的脚本已全部准备就绪 除了一个小问题 多行描述 我在 Jenkins 中使用 REST API 和 JSON 来下载旧的描述 old description curl s user US
  • 我的 Webview 应用程序在聊天时不断崩溃

    除了信使之外 一切都按其应有的方式运行 代码 if url startsWith www messenger com Intent intent new Intent Intent ACTION VIEW Uri parse url sta
  • VBA:如何打开文件夹中最近的两个Excel文件

    我试图打开文件夹中最新的两个 Excel 文件 到目前为止 我确实打开了文件夹中的最新文件 但我必须打开文件夹中的第二个最新文件 参考下面的代码 请建议如何打开第二个最近的文件 Sub findingdiff Dim FileSys obj
  • 如何使用php脚本下载视频

    在我的程序中 我想添加一个下载选项来下载当前的流媒体视频 我尝试了这段代码 psp Tom 20 amp 20Jerry 20race 1 flv header Content type application octet stream h
  • 矩阵乘法问题 - Numpy 与 Matlab?

    我正在尝试将一些 Matlab 代码翻译成 Python 使用 numpy 我有以下 Matlab 代码 1 x eye 2 X就是1000000 据我了解 Matlab中的 表示矩阵乘法 相当于numpy中的 dot 所以在Python中
  • del 语句会打开内存吗?

    我写了一个 python 脚本 可以在晚上睡觉时备份我的文件 该程序设计为在计算机打开时运行 并在备份完成后自动关闭计算机 我的代码如下所示 from datetime import datetime from os import syst
  • MKPinAnnotationView 颜色不起作用

    我试图显示阵列中的一些引脚 它显示了所有引脚 但它们是红色的 而不是我要求的绿色 这是为什么 run on array to get all locations for int k 0 k lt array count k k 2 floa
  • 如何从listView中删除项目?

    我从 Listview 中的 SQLite 获取数据 当用户单击检查时 我需要删除此项框并按删除按钮或仅单击复选框 我不明白该怎么做 这是我的示例代码供参考 MyTable java public class MyTable extends
  • 如何获取嵌入资源的路径?

    我在我的 C 项目中包含了一个嵌入式资源 我知道它的名字以及如何引用它 所以我想知道是否有任何方法可以获得它的绝对路径 有吗 嵌入式资源正是 嵌入式 这意味着 它包含在程序集中 并且在编译后不作为物理文件存在 如果这就是您要查找的内容
  • 错误:(1) 处名称中的字符无效

    我正在尝试编译一个 Fortran 文件以及 FORTRAN 中的一些 h 文件 h 文件包含公共变量块的定义 当我用 Fortran 编译它们时 出现以下错误 integer knue ke knumu kmu knutau ktau k
  • 如何批量更新实体框架中的记录?

    我正在尝试使用实体框架批量更新记录 我尝试过 Entity Framework ExtensionsUpdate method The Update方法能够批量更新具有相同更新值集的一组记录 Example Id Quantity Reco
  • ASP.NET Core 和 EF Core 1.1 - 使用存储过程显示数据

    我的查询有问题 我想在视图上显示结果 HttpGet ValidateAntiForgeryToken public async Task
  • 尝试在 ASP.NET Core MVC 中使用 /me/memberOf 时,Microsoft Graph Api 返回禁止响应

    这是我所拥有的 Api版本为v1 0 private async Task
  • 生命周期管理规则不适用于 ADLS Gen2 存储帐户

    我是使用 Azure 及其技术堆栈的新手 如果我在这里没有使用正确的术语 我深表歉意 我是 Azure 门户上相应工作区和存储帐户的管理员 我设置了一条规则 从我的测试 块 类型 blob 容器 存档目录中硬删除文件 以删除超过 1 天的文
  • 使用Eclipse配置Android SDK的严重问题

    我在使用 Eclipse 配置 ADT 时遇到严重问题 我使用的是 Windows 7 家庭高级版 我使用的 Eclipse 64 位 是 Eclipse Classic 3 7 1 Eclipse Java EE IDE for Web
  • C 中未读取整个文件(EOF 意外发生)

    我正在尝试打印大约 4000 个字符的文件内容 不知何故 程序仅记录前 220 个字符并终止 int main void char ch file name 25 payload 3904 FILE fp printf Enter the