Как объединить два / три указателя на char и открыть оттуда файл в C? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть функция, которая начинается так:

int parseFile (char * filename, char * dirname) {

    int rv, roomStarter = 0;
    char buffer[100];
    FILE *fp;

    //char * slash = malloc(1 * sizeof(char));
    char * catfile = malloc(strlen(filename) + strlen(dirname) + 2); 
    strcpy(catfile,dirname);
    strcat(catfile,"/");
    strcat(catfile,filename);

    printf("file is %s and dirname is %s and size is %d catfile is %s \n",filename,dirname,strlen(dirname),catfile);
    fp = fopen(catfile, "r");

[snip]

Вывод это не то, что я ожидал, и это правильный путь к unk_room. Я либо получаю что-то вроде этого:

$ ./prog

файл unk_room, имя каталога ./dirname и размер 21

файл unk_room и имя каталога ./ dirname и размер 21 catfile is

Ошибка при открытии файла unk_room.

$

(Обратите внимание: catfile пуст, и он пытается открыть имя файла)

или, ошибки о повреждении памяти:

catfile is ./myprog.23202/
catfile is ./myprog.23202/gib_room
*** Error in `./myprog': double free or corruption (out): 0x0000000001f43000 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81679)[0x7fa1eb7d7679]
/lib64/libc.so.6(+0xd6702)[0x7fa1eb82c702]
/lib64/libc.so.6(regfree+0x11)[0x7fa1eb837421]
./myprog[0x401ac0]
./myprog[0x401b90]
./myprog[0x401d3e]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fa1eb778505]
./myprog[0x4010a9]
======= Memory map: ========
00400000-00403000 r-xp 00000000 00:32 3111810123                         /nfs/stak/users/smithj/CS344/hw2/myprog
00602000-00603000 r--p 00002000 00:32 3111810123                         /nfs/stak/users/smithj/CS344/hw2/myprog
00603000-00604000 rw-p 00003000 00:32 3111810123                         /nfs/stak/users/smithj/CS344/hw2/myprog
01f3a000-01f7c000 rw-p 00000000 00:00 0                                  [heap]
7fa1e4000000-7fa1e4021000 rw-p 00000000 00:00 0 
7fa1e4021000-7fa1e8000000 ---p 00000000 00:00 0 

Что мне не хватает?

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