Как я могу открыть существующий файл в 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] = ...;