Обработка файлов: дополнительные символы в выводе - PullRequest
0 голосов
/ 30 сентября 2011
#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 ]

1 голос
/ 30 сентября 2011

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;

 }
1 голос
/ 30 сентября 2011

Похоже, потому что вы не устанавливали данные в нули до того, как начали. Попробуйте добавить

memset(data,0,sizeof(data)); 

прежде чем читать. Дополнительный вывод - это то, что оказалось в памяти в этом месте, прежде чем вы начали его использовать.

1 голос
/ 30 сентября 2011

Первый цикл заканчивается на EOF, который вы не записываете в массив data (потому что вы не можете).

Второй цикл заканчивается на '\0', который нигдев массиве data.

Я предлагаю вам добавить завершающий '\0' после прочтения EOF.

1 голос
/ 30 сентября 2011

Вы не завершаете массив data [] - нечего ставить ноль в конце входного потока, поэтому, когда вы его записываете, вы продолжаете печатать дополнительные (случайные) значения в конце данных довы случайно попали в ноль,

Помните, что данные не инициализируются ни к чему в c

...