【问题标题】:C fread() on short file is producing junk after the file ends短文件上的 C fread() 在文件结束后产生垃圾
【发布时间】:2018-05-23 18:45:32
【问题描述】:

我的教授指定将file_1.txt 一次读取100 字节到char array。我生成了以下 sn-p 代码:

int key;
key = atoi(argv[1]);
FILE *file_pointer;
file_pointer = fopen(argv[2], "rb");
char buffer[100];
char output[sizeof(int)][100];
int output_counter = 0;
int read_counter;
int read_elements;

while(read_elements = fread(buffer, 1, 100, file_pointer) > 0)
{  
    read_counter = 0;    
    while(read_counter < 100)
    {

        printf("xor'ing %d and %d\n", key, buffer[read_counter]);
        output[output_counter][read_counter] = buffer[read_counter] ^ key;
        read_counter = read_counter + 1;
    }

    output_counter = output_counter + 1;
}

fclose(file_pointer);

file_1.txt 读取:“项目的测试文件\n”。我用gccencrypt.c 然后:

./a.out 111 file_1.txt file_2.txt

然后: ./a.out 111 文件_2.txt 文件_3.txt

cat file_3.txt reads: 

项目的测试文件:

v▒▒▒s▒▒@////////▒

在第一次使用file_1.txt 和file_2.txt 运行程序时,会打印嵌套的while 循环中的print 语句:

xor'ing 111 and 116

xor'ing 111 and 101

xor'ing 111 and 115

xor'ing 111 and 116

xor'ing 111 and 32

xor'ing 111 and 102

xor'ing 111 and 105

xor'ing 111 and 108

xor'ing 111 and 101

xor'ing 111 and 32

xor'ing 111 and 102

xor'ing 111 and 111

xor'ing 111 and 114

xor'ing 111 and 32

xor'ing 111 and 116

xor'ing 111 and 104

xor'ing 111 and 101

xor'ing 111 and 32

xor'ing 111 and 112

xor'ing 111 and 114

xor'ing 111 and 111

xor'ing 111 and 106

xor'ing 111 and 101

xor'ing 111 and 99

xor'ing 111 and 116

xor'ing 111 and 10

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 118

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and -88

xor'ing 111 and -31

xor'ing 111 and -94

xor'ing 111 and 2

xor'ing 111 and -120

xor'ing 111 and 127

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and -57

xor'ing 111 and 115

xor'ing 111 and -33

xor'ing 111 and 2

xor'ing 111 and -120

xor'ing 111 and 127

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 1

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and -19

xor'ing 111 and 9

xor'ing 111 and 64

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 47

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and 0

xor'ing 111 and -96

xor'ing 111 and 9

xor'ing 111 and 64

xor'ing 111 and 0

这些random 元素是从哪里来的?

【问题讨论】:

  • 对超长的打印感到抱歉
  • 如果将它们放在代码块中,它们将是可滚动的。
  • 无论您从文件中读取的实际字节数 (read_elements) 如何,您都可以对 100 个字节 (while(read_counter &lt; 100)) 进行异或操作。所以垃圾来自read_buffer[]的未初始化部分。
  • 还有一个优先级错误,所以read_elements在循环中总是1。
  • 不,您应该只处理实际读取的字符数。

标签: c file fread


【解决方案1】:

在使用 fread() 之前将缓冲区 char 数组的所有元素初始化为 0 以消除垃圾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2012-11-27
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多