如何从 getc 读取过去的 EOF?

2023-12-20

我正在编写一个 XOR 加密程序,该程序在加密期间工作正常,但在解密期间工作正常 这

char ca2=fgetc(f);

被卡在某一点并且之后不会发生解密,我对问题的最好猜测是(加密文件包含各种字符)一旦 fgetc 到达 EOF 标记(该标记可能出现在文件的实际结尾之前),它就会被卡住在那里并停止阅读下一个字符。

这是 getc() 的某种限制吗?这是我的垃圾代码

int get_file_size(char  filename[]) 
{
    FILE *p_file = NULL;
    p_file = fopen(filename,"rb");
    fseek(p_file,0,SEEK_END);
    int size = ftell(p_file);
    fclose(p_file);
    return size;
}

int endec(char filename[],char psdw[])
{
    FILE *f;
    int hashed=0,ed=0;
    int inphash=inhash(psdw);
    inphash=inphash%50;
    f=fopen(filename,"r");
    if(f==NULL)
    printf("failed");

    char temps[999999];
    long int crs=0,j=0;
    int filesz=get_file_size(filename);
    printf("file size = %d\n\n",filesz);
while(1){

    inphash=inphash+2;
    char ca=(char)inphash;
    char ca2=fgetc(f);
    printf("%c\n",ca2);
    if(crs>=filesz)
        break;
    temps[crs]= ca2 ^ ca;
    crs++;

        }
fclose(f);
printf("%d",strlen(temps));

FILE *fp;
fp=fopen(filename,"wt");
for(j=0;j<crs;j++){
        putc (temps[j] , fp);
printf("%c",temps[j]);

}
fclose(fp);
}

你的问题就在这里:

f=fopen(filename,"r");

您打开文件是为了文本读取,而不是二进制读取。您的文件大小函数可以正确计算,但解码器函数则不能。

使用 C 风格 IO 例程逐字符读取文件的惯用方法如下:

f = fopen(filename, "rb");

if (!f)
    // handle error

int c;   // NOTE:  int, not char!

while ( (c = fgetc(f)) != EOF )
{
    // do something with 'c'
}

这个成语的作用是not要求您将文件大小作为单独的操作来获取。您可以使用上述形式的简单循环重写您的 XOR“加密”例程。将会更加清晰和简洁。

您的整个解码器函数可以重写如下:(减去调试代码)

int endec(char filename[], char psdw[])
{
     int inphash = inhash(psdw) % 50;
     char temp[999999];  // really, should be std::vector<char>
     FILE *f;

     if ( (f = fopen(filename, "rb")) == NULL )
     {
         printf("opening for read failed\n");
         return -1;
     }

     size_t crs = 0;
     int    c;

     while ( (c = fgetc(f)) != EOF )
     {
         inphash += 2;
         temp[crs++] = (char)(inphash ^ c);
     }
     fclose(f);

     if ( (f = fopen(filename, "wt")) == NULL )
     {
         printf("opening for write failed\n");
         return -1;
     }

     if (fwrite(temp, crs, 1, f) != crs)
     {
         printf("short write\n");
         fclose(f);
         return -1;
     }

     fclose(f);
     return 0;
 }

Not stellar错误处理,不过是错误处理。

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

如何从 getc 读取过去的 EOF? 的相关文章

随机推荐

  • 并行 make:将 -j8 设置为默认选项

    我可以使用以下命令设置构建过程的线程数 j争论 比如我有4核 4虚拟 当我写的时候 make j8速度增加4倍 是否可以将该值设置为默认值 例如 在Linux Gentoo中 在配置文件中 可以设置这个默认值 附注我有 Arch Linux
  • Windows 10 高分辨率屏幕上的 Spyder 界面图标非常小

    我有一台全新的笔记本电脑 分辨率为 3840 x 2160 运行 Windows 10 在安装 Anaconda Spyder 进行 python 编码后 我注意到图标非常小 对象检查器部分的文本也非常小 有没有办法来解决这个问题 这似乎与
  • 如何在 ANSI C 的结构中使用枚举?

    下面的代码必须在主函数中使用 但我不知道它是如何使用的 struct SomeItem enum MOVIE MUSIC itemType union struct Movie movie struct Music music 该结构用于带
  • Highchart js 最多可绘制 15 个图

    我在 Highchart js 中进行了很多尝试 但仍然找不到减少系列中元素数量的方法 如果我获得超过 15 天的数据 我必须将其减少并以 15 天的数据形式向用户显示 以便用户可以在不拥挤的情况下查看数据 该系列最多有 90 天 我必须减
  • IntelliJ IDEA 仅运行/调试一个文件

    我在 IntelliJ IDEA 中有一个 JAVA 项目 有多个包 但我的包中的某些文件有自己的main 方法并且可以自己运行 但是 如果我右键单击给定文件并选择 调试 运行 File main IntelliJ 将尝试构建包中的所有文件
  • ASP.NET MVC 3 中是否可以有多个依赖解析器?

    ASP NET MVC 3 中是否可以有多个依赖解析器 类似于 ModelBinder 和 Provider 的情况 我可以想到一种场景 拥有多个 容器 或 解析器 是有用的 那就是多租户 通过多租户 您可以在同一个 Web 应用程序中运行
  • 禁用 g++ 的返回值优化

    我需要在命令行上使用什么标志来禁用 g 编译器自动启用的返回值优化 fno elide constructors C 标准允许实现省略创建临时对象 该临时对象仅用于初始化相同类型的另一个对象 指定此选项会禁用该优化 并强制 G 在所有情况下
  • Android:调整位图大小而不损失质量

    在发布之前我确实搜索了整个网络 我的问题是 我无法在不损失图像质量的情况下调整位图大小 质量非常差并且像素化 我从相机获取位图 然后必须缩小它的尺寸 这样我就可以更快地将其上传到服务器 这是进行采样的函数 public Bitmap res
  • 继承自 HtmlHelper 而不是扩展它

    我正在创建一组用于渲染兼容的助手推特引导程序 http twitter github com bootstraphtml 在我看来 当谈到如何将这些方法组合在一起时 我有两种选择 扩展 HtmlHelper 在方法中添加 TB 前缀 创建一
  • Python正则表达式匹配<之前的单词

    所以我想匹配这样的东西 foo
  • 当前日期与日期字段之间的天数

    我有这个问题如果有人可以帮忙的话 有一个字段 date 在我的桌子上 table1 这是格式为的日期3 31 1988 M D y 我需要定义自该日期以来已经过去了多少天 我试图给出这个指示 SELECT DATEDIFF CURDATE
  • Angularjs,对表中选定的复选框应用操作

    我正在尝试学习 AngularJS 并实现此复选框 当我从网格中选择一些复选框并单击 删除 按钮时 应从选定的复选框中删除表中的数据 我尝试过但不知道如何实现它 请参阅我在 Plunker 上的这段代码 http plnkr co edit
  • 为什么 SELECT FOR UPDATE 只能在事务中起作用?

    我想我很困惑选择更新 https dev mysql com doc refman 5 0 en innodb locking reads html构造 例子 mysql gt select from employees2 EmpId Em
  • msm 包中出现错误:*** 捕获段错误 *** “内存未映射”

    我正在尝试使用 msm 包运行多状态模型 但遇到以下错误 caught segfault address 0x607c00032c60 cause memory not mapped The data dat long lt structu
  • 如何使用 JavaScript 来限制最小值/最大值之间的数字?

    我想限制两个值之间的数字 我知道在 PHP 中你可以这样做 number min max intval number 1 20 this will make number 1 if it s lower than 1 and 20 if i
  • 即使所选选项没有更改,是否有任何方法可以在 Chrome 中的 SELECT 元素上触发单击事件?

    我有一个 SELECT 元素 其内容 选项元素 通过 AJAX 加载 并在准备就绪时以及更改不同的 SELECT 时插入 两个 SELECT 都有两个 OPTION 元素附加到通过 AJAX 加载的元素列表中
  • PHP Pthreads 最新版本 3.1.6(64 位)未安装在 Apache 上

    我正在尝试为 PHP 安装最新的 pthreads 扩展 3 1 6 64 位 根据 pthreads 的作者建议 http github com krakjoe pthreads http github com krakjoe pthre
  • 何时支持 ng-if 与 ng-show/ng-hide?

    我明白那个ng show and ng hide影响元素上设置的类ng if控制元素是否呈现为 DOM 的一部分 有没有选择指南ng if over ng show ng hide或相反亦然 取决于您的用例 但总结一下差异 ng if将从
  • 在字头表中添加页码 C#

    我在word中创建了一个1x3表格作为我的标题 这就是我想要的样子 左侧文本 中间文本 页码 我希望 PageNumber 单元格看起来像这样 页码 X Y 我已经成功地完成了单元格 1 1 和 1 2 我发现这可以帮助我处理单元格 1 3
  • 如何从 getc 读取过去的 EOF?

    我正在编写一个 XOR 加密程序 该程序在加密期间工作正常 但在解密期间工作正常 这 char ca2 fgetc f 被卡在某一点并且之后不会发生解密 我对问题的最好猜测是 加密文件包含各种字符 一旦 fgetc 到达 EOF 标记 该标