Как я могу открыть существующий файл в XCode в C?

Я создал файл с именем mahmoud.txt в директории: /Users/mahmoudhamra/Desktop/C language/

Я хочу открыть его в Xcode.

Я создал каталог и имя файла в строку каждый. Затем я связал имя файла с каталогом и попытался открыть его, чтобы прочитать, но он всегда выдает мне ошибку: "Поток 1: сигнал SIGBART".

Может кто-то помочь мне, пожалуйста? Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main(int argc, const char * argv[]) {


    FILE *inFile;
    char fileName[13];

    printf("enter file name: ");
    scanf("%s",fileName);

    char new[40]="/Users/mahmoudhamra/Desktop/C language/";
    strcat(new, fileName);

    inFile=fopen("new", "r");

    if (inFile== NULL) {
        printf("file %s was not opened!\n", fileName);
        printf("check that the file exists!\n");
        exit(1);


    }
    else
        printf("the files has successfully been opened!\n");




    return 0;
}

2 ответа

Прежде всего это

char new[40]="/Users/mahmoudhamra/Desktop/C language/";

должно быть как минимум

char new[41]="/Users/mahmoudhamra/Desktop/C language/";

оставить место для нулевого терминатора. C-строка - это массив символов с нулевым терминатором (0x00, '\0', 0) как последний символ

Лучше всего будет:

char new[]="/Users/mahmoudhamra/Desktop/C language/";

Кстати, ваша проблема в том, что у вас нет места для добавления filename символы, так что по крайней мере вы должны определить это как

char path_and_file[128] = {0};
strncpy(path_and_file, "/Users/mahmoudhamra/Desktop/C language/", sizeof(path_and_file)-1);

Если вы хотите узнать что-то о динамическом размещении, вы можете:

char *directory = "/Users/mahmoudhamra/Desktop/C language/";
char *path_and_file = malloc(strlen(directory)+1);
if (path_and_file != NULL)
{
   strcpy(path_and_file, directory);

   printf("enter file name: ");
   scanf("%s",fileName);

   path_and_file = realloc(path_and_file,strlen(directory)+strlen(filename)+1);
   if (path_and_file != NULL)
   {
      strcat(path_and_file, filename);

      // YOUR STUFF

   }
}


free(path_and_file);

Другой способ динамического размещения - использование strdup для создания вашей первой строки:

char *path_and_file = strdup("/Users/mahmoudhamra/Desktop/C language/");

РЕДАКТИРОВАТЬ

Последнее, как заметил @visibleman, призыв к fopen должны быть изменены на

inFile=fopen(new, "r");

или по моим примерам:

inFile=fopen(path_and_file, "r");

Проблема почти наверняка заключается в размере new массив символов, так как он не может вместить полное имя файла и вызовет переполнение стека:

char new[40]="/Users/mahmoudhamra/Desktop/C language/";
strcat(new, fileName);

Изменить 40 в 1024:

char new[1024] = ...;
Другие вопросы по тегам