我在C语言中用二进制文件进行IO时,哪里出了问题?

问题描述 投票:0回答:1

我需要用凯撒密码加密一个句子(还没有完成,需要检查是否有问题)。xyzXYZ 也),打开一个二进制文件,并在那里写下加密代码。第一个参数应该是二进制文件的名称,并选择是否要添加一句话或显示它,如果我输入'#'作为第一个参数,它会提示我输入二进制文件的名称,从那里读取代码。它应该是这样的。

./a.out CODE.DAT >> A >> Kekli kek >> S >> Nhnol nhn >> E.

现在,当我这样做,

./a.out '#' >> CODE.DAT 

它给我正确的字符串,直到最后一个字符。比如说

Nhnol nhM�b�U"

另外,如果我的代码中有什么不好的习惯,或者有什么建议可以让我写出更干净、更好的代码,如果你能指出来,我会非常高兴。

主函数

int main(int argument_count, char **argument_vector) {
    if ((**(argument_vector + 1)) == '#') {
        FILE *stream;
        printf("Name of file: \n");
        char stream_name[15];
        scanf("%s", stream_name);
        if ((stream = fopen(stream_name, "rb")) != NULL) {
            char string[50];
            fread(string, sizeof(char *), 1, stream);
            printf("%s\n", string);
            fclose(stream);
        }
    } else
    if (argument_count == 2) {
        char character;
        do {
            printf("ADD [A], SHOW [S], END [E]\n");
            scanf("\n%c", &character);
            if (character == 'A') {
                FILE *stream;
                char string[50];
                read(string);
                code(string);
                if ((stream = fopen(*(argument_vector + 1), "wb")) != NULL) {
                    fwrite(string, sizeof(char *), 1, stream);
                    fclose(stream);
                }
            } else
            if (character == 'S') {
                FILE *stream;
                if ((stream = fopen(*(argument_vector + 1), "rb")) != NULL) {
                    char string[50];
                    fread(string, sizeof(char *), 1, stream);
                    printf("%s\n", string);
                    fclose(stream);
                }
            }
        } while (character != 'E');
    } else
        return printf("Error"), 1;
}

代码功能:

void code(char *string) {
    int i = 0;
    for(; string[i] != '\0'; i++) {
        if ((int)string[i] == 32)
            string[i] = ' ';
        else
            string[i] += 3;
    }
    string[i + 1] = '\0';
}

读取函数:

void read(char *string) {
    printf("Input string: \n");
    scanf("\n%[^\n]%*c", string);
}
c binaryfiles
1个回答
3
投票

问题就出在这段代码上。

        char string[50];
        fread(string, sizeof(char *), 1, stream);
        printf("%s\n", string);

fread() 读取的是二进制数据,所以没有加一个空结束符。

另外。sizeof(char *) 是错误的。你读的是一个字符串,不是指针。但是 fread() 是用于读取固定大小的数据。如果你想读取一个可变大小的字符串,你应该指定为 1 作为对象的大小,并达到了。49 对象(你需要为空终止符留出空间)。fread 返回成功读取的对象数量,用它来决定在哪里添加null字节。

        char string[50];
        size_t n = fread(string, 1, 49, stream);
        if (n > 0) {
            string[n] = '\0';
            printf("%s\n", string);
        }
© www.soinside.com 2019 - 2024. All rights reserved.