gpt4 book ai didi

c++ - fgetc() 读取 0c 符号并且数组元素无效?这是为什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:17 25 4
gpt4 key购买 nike

我注意到了一件有趣的事情,但我不确定它是否应该以这种方式发生。

我得到了一些使用 fgetc() 的代码;从文件中读取符号并将它们存储到一个 int say l 中;

  l=fgetc(file); 

文件以读取二进制模式(“rb”)打开;使用

  file=fopen("filename", "rb");

然后使用字符串流将每个符号转换为十六进制格式并发送到字符串中,然后存储在一个字符数组中;

  std::stringstream sl;


sl << std::hex << l; sl >> sll;

char as[i]=sll[i];

问题是当 fgetc();读取一个符号,该符号在 ascii 表中以十六进制格式表示为 OC 或以 char 形式表示为 FF 我的最终字符数组填充为 0。

简而言之,如果 char[] 元素包含 0c,则其余元素为 0;

我不知道为什么会这样。当我使用十六进制编辑器编辑文件并将 0c 替换为其他内容时。该文件被正确读取,并且所有符号都在写入文件时存储在数组中。

如果您能告诉我们如何规避此类行为,我将不胜感激。

好的。完整代码:

#include <stdio.h>
#include<iostream>
#include <string.h>
#include "u.c"
#include <wchar.h>
#include <sstream>

int main() {
unsigned long F, K;
std::string k;
char hhh[300];
char hh1[300];
char kk[64];
int lk;

memset(kk, 0, 64);

FILE *diy;
FILE *ydi;

std::cin >> k;
std::cin >> hhh;
std::cin >> hh1;
lk = k.length();

for (int i = 0; i < lk; i++) {
kk[i] = k[i];
}

;
bof(kk, lk);
diy = fopen(hhh,"rb");
ydi = fopen(hh1,"wb");

int mm = 0;
int l;
int r;
char ll[9];
char rr[9];

memset(ll, 0, 9);
memset(rr, 0, 9);

std::string sll;
std::string slr;
char sL[3];
char sR[3];
int i = 0;

while (!feof(diy)) {
l = fgetc(diy);
r = fgetc(diy);

std::stringstream sl;
std::stringstream sr;

sl << std::hex << l;
sl >> sll;
sL[0] = sll[0];
sL[1] = sll[1];
sr << std::hex << r;
sr >> slr;
sR[0] = slr[0];
sR[1] = slr[1];

if (i == 0) {
ll[0] = sL[0];
ll[1] = sL[1];
ll[2] = sR[0];
ll[3] = sR[1];
sL[0] = '\0';
sR[0] = '\0';
sL[1] = '\0';
sL[1] = '\0';
}

;

if (i==1) {
ll[4] = sL[0];
ll[5] = sL[1];
ll[6] = sR[0];
ll[7] = sR[1];
sL[0] = '\0';
sR[0] = '\0';
sL[1] = '\0';
sL[1] = '\0';
}

;

if (i == 2) {
rr[0] = sL[0];
rr[1] = sL[1];
rr[2] = sR[0];
rr[3] = sR[1];
sL[0] = '\0';
sR[0] = '\0';
sL[1] = '\0';
sL[1] = '\0';
}

;

if(i==3){
rr[4] = sL[0];
rr[5] = sL[1];
rr[6] = sR[0];
rr[7] = sR[1];
sL[0] = '\0';
sR[0] = '\0';
sL[1] = '\0';
sL[1] = '\0';
}

;

sL[0] = '\0';
sR[0] = '\0';
sL[1] = '\0';
sL[1] = '\0';

if (i == 3) {
printf(" %s %s \n ", ll, rr); //indicated that my rr array had problems with that 0x0c;
sscanf(ll, "%08lX", &F);
sscanf(rr,"%08lX",&K);
printf(" before %08lx %08lx \n ", F, K);
omg( &F, &K);
printf(" after %20lx %20lx \n ", F, K);
memset(ll, 0, 9);
memset(rr, 0, 9);

char RR[9];

sprintf(RR, "%08lx", F);

char LL[9];

sprintf(LL, "%08lx", K);
printf(" %s %s ", LL, RR);

for (int j = 0; j < 4; j++) {
char ls[3];

ls[0] = LL[j*2];
ls[1] = LL[2*j+1];

int kj;

std::stringstream op;
op << ls;
op >> std::hex >> kj;
fputc(kj, ydi);
}

;

for(int j = 0; j < 4; j++) {
char lr[3];

lr[0] = RR[j*2];
lr[1] = RR[2*j+1];

int kjm;

std::stringstream ip;
ip << lr;
ip >> std::hex >> kjm;
fputc(kjm,ydi);
}

;

memset(LL, 0 ,9);
memset(RR, 0, 9);
}

;
i++;
std::cout << "\n";

if (i == 4) {
i = 0;
}

;
}

;

fclose(diy);
fclose(ydi);
}

;

既然你问了,现在你有了。

  1. 此代码无法编译,因为您没有必要的库。
  2. 简化代码在本文开头。
  3. 您不拥有的那些库与此问题无关。

最佳答案

核心问题

你假设

std::stringstream the_stream;
std::string the_string;

the_stream << std::hex << 0x0C;
the_stream >> the_string;

结果为 the_string包含 "0c" .但是,它将包含 "c" .

这意味着稍后,您最终会转换输入 "\x0c\xfe"'c', '\0', 'f', 'e' .如果您在 C 风格字符串中的任何位置使用它,当然它会在 c 之后结束字符串.


调试这个程序相当困难。将来,请编写可读易懂的代码。以下是我发现的问题的非详尽列表。

设计问题

  • while(!feof(file)) is always wrong .
  • 使用变量范围。如果拉出 sL 的声明和 sR进入循环,你不必重置它们。更少的代码,更少的潜在错误。
  • 您使用了很多代码来完成一些简单的事情,例如转换大概是 8 位的 char。到它的十六进制表示。事实上,您使用 std::stringstream 的唯一原因在你的代码中就是这样做的。为什么不将此功能隔离为一个函数?

不相关的问题

  • 由于代码格式不佳,您可能没有注意到使用 sL 时的复制粘贴错误。和 sR :

    sL[0] = '\0';
    sR[0] = '\0';
    sL[1] = '\0';
    sL[1] = '\0';

    显然,最后一行应该是 sR[1] = '\0';

风格问题

您的代码有很多很多错误,但很容易阻止人们提供帮助的一件事是格式化。特别是空格格式使您的代码很难阅读,因此我冒昧地编辑了您问题中的“完整”代码以具有(几乎)一致的格式。一些基本问题变得明显:

  • 为变量和函数使用有意义的名称。我不知道你想在这里做什么,这无助于找到代码中的真正问题。
  • 混合 <iostream><stdio.h>不利于代码的可读性。选择一个或另一个。事实上,only ever use <iostream> in C++ .
  • 除此之外,使用适当的 C++ header 名称(<cstring><cwchar> 而不是 <string.h><wchar.h>)。
  • 不要在复合语句后写分号。而不是

    int main(void) {
    if (condition) {
    one_statement();
    another_statement();
    };
    };

    你应该写

    int main(void) {
    if (condition) {
    one_statement();
    another_statement();
    }
    }

    ;单独声明的一部分。它还会阻止您使用 else构造。

  • 在适当的地方使用初始化程序。所以不要写

    char ll[9];
    char rr[9];

    memset(ll, 0, 9);
    memset(rr, 0, 9);

    同时

    char ll[9] = { 0 };
    char rr[9] = { 0 };

    更具可读性。

关于c++ - fgetc() 读取 0c 符号并且数组元素无效?这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40123799/

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