文件处理:输出中的额外字符

时间:2011-09-30 15:20:24

标签: c file gcc file-handling

#include <stdio.h>

int main () {

    FILE *fp;
    char ch;
    char data[100];
    int i;

    fp = fopen("file.txt","r");

    i=0;

    while( (ch=fgetc(fp)) != EOF) {
            data[i]=ch;
            i++;
    }

    i=0;

    while(data[i]) {
            printf("%c",data[i]); 
            i++;
    }

 return 0;

 }

file.txt的内容:

udit@udit-Dabba /opt/lampp/htdocs $ cat file.txt 
aGVsbG9teW5hbWVpc2toYW4K

计划的输出:

udit@udit-Dabba /opt/lampp/htdocs $ sudo vim test.c
udit@udit-Dabba /opt/lampp/htdocs $ sudo gcc test.c
udit@udit-Dabba /opt/lampp/htdocs $ ./a.out
aGVsbG9teW5hbWVpc2toYW4K
P�udit@udit-Dabba /opt/lampp/htdocs $ 

为什么这两个额外的字符出现在数组的输出中...... ??? 输入文件实际上是base-64编码的结果。

4 个答案:

答案 0 :(得分:1)

你没有终止数据[]数组 - 没有什么可以在输入的末尾加零,所以当你把它写出来时,你要在数据末尾打印额外的(随机)值,直到你碰巧碰到了零,

记住数据未初始化为c

中的任何内容

答案 1 :(得分:1)

它看起来像是因为你没有在开始之前将数据设置为零。尝试添加

memset(data,0,sizeof(data)); 
在你阅读之前

额外的输出是在你开始使用它之前在该位置的内存中发生的事情。

答案 2 :(得分:1)

第一个循环以EOF终止,您不会写入data数组(因为您不能)。

第二个循环以'\0'终止,而data数组中没有{。}}。

我建议您在阅读'\0'后添加终止EOF

答案 3 :(得分:1)

fgetc会返回int而不是char

看看这是否适合您:

#include <stdio.h>

int main (void) {

    FILE *fp;
    int ch;
    int data[100] = { 0 }; // Easiest way of initializing the entire array to 0
    int i;

    fp = fopen("file.txt","r");

    i=0;

    while( (ch=fgetc(fp)) != EOF) {
            data[i]=ch;
            i++;
    }

//        data[i]=0; -->You did not provide a terminating point - 
// Not needed if the array is initialized the way i did.

    i=0;

    while(data[i]) {
           printf("%c",data[i]); 
            i++;  }
 return 0;

 }