gpt4 book ai didi

c - 是否可以使用 fgetc 计算文件中的特定十六进制数?

转载 作者:行者123 更新时间:2023-12-05 04:28:44 26 4
gpt4 key购买 nike

我想编写一个代码来计算文件中特定十六进制数的出现次数。例如在文件中有 0x01 0x02 0x03 0x41 0x42 0x43 0x0D 0x0A 0xFF 0xFE 0xFD 0x01 0x02 0x03 0x80 0x7F 0x0D 0x0A 如果我输入:FF 它将输出:1

我已经在写代码了,但它似乎不起作用

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

main ()
{
FILE *in, *out;
unsigned char a[1000] = { 0 };
int b;
int count = 0, i = 0;
in = fopen ("a.dat", "rb");
out = fopen ("b.txt", "wb");
while (!feof (in)) {
b = fgetc (in);
a[i] = b;
i++;
}

scanf ("%x", &b);
for (i = 0; i < 1000; i++) {
if (a[i] == b) {
count++;
}
}

fprintf (out, "%d\n", count);
printf ("%d\n", count);
fclose (out);
fclose (in);
return 0;
}

(注意:修复了 '}' 的嵌套错误)

最佳答案

你有大量的小错误。它们可以概括如下:

  • while (!feof(in)) 读取 one-character-too-many。看看循环的逻辑。读取最后一个字符后,检查 !feof(in)(尚未发生),然后再次调用 b = fgetc (in);(现在返回EOF),然后你盲目分配a[i] = b;。那是 Why is while ( !feof (file) ) always wrong?只需使用读取函数的返回值来控制读取循环。
  • 您在 scanf() 中使用了错误的类型。 %x 需要一个 unsigned int* 值,但您传递的类型是 int*。这将导致 signedunsigned 类型不匹配的问题。当您在启用警告 的情况下进行编译时,这一点很明显。
  • 您未能验证您打开inout 是否成功。始终验证每个文件打开操作。
  • 您未能验证 scanf() 的返回值。您不能正确使用 scanf(),除非您验证返回的数字等于预期的有效转换数。
  • 既然您写入了b.txt,您应该验证fclose(out)。始终验证您的close-after-write,以确保您捕获代码写入最后一个值之后发生的任何写入错误。
  • 无需遍历数组的所有 1000 元素。你从i的值知道填充的元素个数。只需循环使用单独的循环变量(如下所示的 j)填充的元素。
  • 最后,当您需要用户输入时,不要让用户盯着屏幕上闪烁的光标,想知道程序是否挂起或正在发生什么,提示用户输入。

将所有部分放在一起,您可以执行类似于以下操作的操作:

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

#define MAXC 1000 /* if you need a constant, #define one (or more) */

int main (void)
{
FILE *in, *out;
unsigned char a[MAXC] = { 0 };
int b;
unsigned u; /* unsigned value required for scanf() */
int count = 0, i = 0, j;

in = fopen ("a.dat", "rb");
out = fopen ("b.txt", "wb");

if (!in) { /* always validate every file open */
perror ("fopen-a.dat");
return 1;
}

if (!out) { /* always validate every file open */
perror ("fopen-b.txt");
return 1;
}

/* protect array bound - use read function to control loop */
while (i < MAXC && (b = fgetc (in)) != EOF) {
a[i] = b;
i++;
}

fputs ("enter 8-bit hex value to find: ", stdout);
if (scanf ("%x", &u) != 1) { /* validte every user-input */
fputs ("error: invalid hex input.\n", stderr);
return 1;
}

for (j = 0; j < i; j++) { /* iterate over values read from file */
if (a[j] == u) {
count++;
}
}

fprintf (out, "%d\n", count);
printf ("%d\n", count);

if (fclose (out) == EOF) { /* always validate close-after-write */
perror ("fclose-out");
}
fclose (in);
}

示例使用/输出

在启用完整警告的情况下编译代码,您可以:

$ gcc -Wall -Wextra -pedantic -Wshadow -std=c11 -O3 -o bin/readwriteucbin readwriteucbin.c

在提供的二进制输入上运行您的代码,例如

$ ./bin/readwriteucbin
enter 8-bit hex value to find: 0xff
1

或者匹配多个值的地方,例如

$ ./bin/readwriteucbin
enter 8-bit hex value to find: 1
2

关于c - 是否可以使用 fgetc 计算文件中的特定十六进制数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72540223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com