Нежелательные символы, записанные во время записи строки в двоичный файл - PullRequest
1 голос
/ 04 сентября 2011

У меня есть программа, которая просматривает иерархию файловой системы, перечисляя имена путей к файлам в двоичном файле следующим образом:

struct list_rec{
    int seqno;
    int path_length;
    char *file_path;
};
FILE *listoffiles;
int no_of_files;/*couter to keep track of files visited*/
static int list_the_files(const char *fpath,const struct stat *sb, int tflag, struct   FTW *ftwbuf)
{
struct list_rec t;
 no_of_files = no_of_files+1;
 t.seqno = no_of_files;
 t.path_length = strlen(fpath);
 t.file_path = malloc((sizeof(char)*t.path_length)+1);
 strcpy(t.file_path,fpath);

 fwrite(&t.seqno,sizeof(int),1,listoffiles);
 fwrite(&t.path_length,sizeof(int),1,listoffiles);
 fwrite(t.file_path,t.path_length,1,listoffiles);

 free(t.file_path);

 return 0;
}

int main(int argc, char *argv[])
{
 listoffiles = fopen("/home/juggler/Examples/Traces/files.txt","r+b");
 no_of_files = 0;
 ftw(argv[1],list_the_files,20);
}

, а затем прочитайте файл для проверки из другой программы следующим образом:

struct list_rec{
    int seqno;
    int path_length;
    char *file_path;
};
FILE *listoffiles;
int main()
{
    struct list_rec t;

    listoffiles = fopen("/home/juggler/Examples/Traces/files.txt","rb");
    if(!listoffiles)
    {
            printf("Unable to open file");
            return 1;
    }



    while(fread(&t.seqno,sizeof(int),1,listoffiles)!=0)
    {
    printf("\n %d  ",t.seqno);/*Log Record Number*/
    fread(&t.path_length,sizeof(int),1,listoffiles);
            printf(" %d",t.path_length);
    t.file_path = malloc(sizeof(char)*t.path_length);
            fread(t.file_path,t.path_length,1,listoffiles);
            printf(" %s",t.file_path);

    fflush(stdout);
    }
}

Моя проблема заключается в том, что вывод при запуске второй программы показывает некоторые нежелательные символы, добавленные к некоторым путям файла, следующим образом: проверьте записи 51611 и 51617

51611   92 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/document6_new.pdf��
51612   99 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/proof with graph.tex.sav
51613   115 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/Operations beyond read and write.tex.bak
51614   107 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/singe version implementation.blg
51615   93 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/formalization1.pdf
51616   92 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/document6_new.texÉ… 
51617   95 /media/New Volume/ March2010/June_2009/new latex_12 may 2009/cascading undone.tex

Ответы [ 3 ]

3 голосов
/ 04 сентября 2011

Вы не пишете завершающий NULL для file_path (или не учитываете пространство, необходимое для него), поэтому, когда вы читаете его обратно в ... он не завершается нулем.

3 голосов
/ 04 сентября 2011

Вы не завершаете пути к файлам, когда читаете их обратно.

Вы должны выделить на один символ больше, чем длина строки, и установить для этого последнего символа значение 0 (fread для вас этого не сделает).

2 голосов
/ 04 сентября 2011
t.file_path = malloc(sizeof(char)*t.path_length);
fread(t.file_path,t.path_length,1,listoffiles);
printf(" %s",t.file_path);

из кода ясно, что вы забыли добавить нулевой символ в конец t.file_path. malloc не инициализирует данные, на которые указывает возвращенный указатель.

...