Char更改邻居

时间:2016-01-27 05:38:55

标签: c fopen fgetc

我的代码存在一些问题,我不太明白。我读了一个文件(你可以尝试使用任何文件)来获取十六进制值。我试图找到某些十六进制值并改变它们 - 它的工作类型,但它应该比它应该更晚。例如:

0xAA 0xAB 0xAC 0xAD 0XAE ... 0XCD 0xCE

我想改变0xAB,但我的代码改变了0XCD。不知道为什么会这样,但也许我做错了。还有办法自动获取文件长度吗?我只是放了一个缓冲区,它是文件的一部分,但我希望得到真正的长度。

#include <stdio.h>
#include <string.h>

#define FLEN 512

int convert_to_hex(char c);

int main(int argc, char *argv[]) {

    char c;
    int i = 0;

    FILE *fp = fopen(argv[1],"rb");

    for(i = 0; i < FLEN; i++) {
        c = convert_to_hex(fgetc(fp));
        printf("%02x ", c);
    }
    printf("\n");
}

int convert_to_hex(char c)
{
    char hexVal[3];
    sprintf(hexVal, "%02X", 0x69);

    if(strncmp(&c, hexVal, 2) == 1) {
        printf(">> %s ", hexVal); // indicate where it change (late)
        return c + 1;
    }
    return c;
}

2 个答案:

答案 0 :(得分:1)

这是一个错误。

if(strncmp(&c, hexVal, 2) == 1) {

strncmp()的第一个参数应该是以NULL结尾的字符串。但是,您传递的是指向单个字符的指针。我不明白你的convert_to_hex()功能正在尝试完成什么,否则我可以提出另一种选择。

要确定文件长度,只需检查fgetc()的返回值是否为EOFEOF是一个特殊值,表示您在文件的末尾。

int c = fgetc(fp); // declare an int to hold the return value from fgetc()
int fileLength = 0; // keep track of the file length
while(c != EOF) { // repeat while we're not at the end of the file
    c = convert_to_hex(c);
    printf("%02x ", c);
    c = fgetc(fp); // get the next character
    fileLength++; // increment fileLength for each character of the file.
}
// we're done! - fileLength now holds the length of the file

答案 1 :(得分:1)

事实证明答案非常简单,将我的convert_hex更改为:

int convert_to_hex(char c)
{
    if (c == 0x69) {
        c = c + 1;
    }
    return c;
}

this answer是为我解决的问题。还要感谢其他人。