使用fread在C中读取ASCII文件

时间:2017-05-04 04:01:39

标签: c file-io ascii bit-shift

我正在尝试使用fread()读取ascii文件,按位补充每个字节并通过添加3并写入新文件对其进行编码。这是我到目前为止,但我一直遇到错误有没有人知道如何解决这个问题?我遇到的错误是按位补充,我的input.txt文件中有当前值 AB1 C23 DEF 但这是写入output.txt文件的内容 AB1 C23 DE

所以不确定如何解决它。

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

int main() {
    // declare variables
    FILE *ip = NULL;
    FILE *op = NULL;
    unsigned char *b;
    int i;

    // open files
    ip = fopen("input.txt", "r");
    op = fopen("out.txt", "w+");

    char out;
    while(fread(b,sizeof(b), 1, ip) == 1) {
        out = ~(&b); 
        //printf("%s\n", b);
        fwrite(out, sizeof(b), 1, op);
    }

    if (feof(ip)) {
        fclose(ip);
        fclose(op);
    }
}

1 个答案:

答案 0 :(得分:-1)

您的代码中存在一些问题,但可能导致程序崩溃的问题是您使用变量b

unsigned char *b;

b之前的星号表示变量b是指向char的指针,即char的内存地址。但是,您实际上从未在b指向的内存中分配位置。

while(fread(b,sizeof(b), 1, ip) == 1) {
    out = ~(&b); 
}

请注意,您在传递b作为fread应该写入的指针,这是正确的,但是您使用sizeof(b),这将不是大小一个char,但是指向char的指针的大小(通常分别是8位对64位)。然后,在while循环内,引用&b,它是b的内存地址,即指向指针的指针,这不是您想要操作的指针。要让您的计划发挥作用,您需要将b声明为char并从那里开始工作。您的代码应如下所示:

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

int main() {
    // declare variables
    FILE *ip = NULL;
    FILE *op = NULL;
    char b;
    int i;

    // open files
    ip = fopen("input.txt", "r");
    op = fopen("out.txt", "w+");

    while(fread(&b, sizeof(b), 1, ip) == 1) {
        b = ~b; 
        printf("%c\n", b);
        fwrite(&b, sizeof(b), 1, op);
    }

    fclose(ip);
    fclose(op);
}