Я пишу код чтения Vanilla File.
Большая часть выглядит так.
Во-первых, заголовочный файл file.h
// fheader.h
#ifndef __file_h__
#define __file_h__
// start from here
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void readFile(FILE *fr);
FILE* openFile(char *file_name);
#endif
основной файл fmain.c
#include "fheader.h"
void readFile(FILE *fr) {
// Added Printf
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
printf("\n...\n");
char *buffer = calloc(sizeof(char),1);
while(!feof(fr)) {
fread(buffer,sizeof(char),1,fr);
printf("%s\n",buffer);
}
free(buffer);
return;
}
FILE* openFile(char *file_name) {
// printf("the file name that is going to be opened is %s",file_name);
FILE *fr;
fr = fopen(file_name,"r");
return fr;
}
int main(int argc,char *argv[]) {
if(argc < 2) {
printf("USAGE: ./file test.txt\n");
return 1;
}
if (argc > 2) {
printf("ERROR: Too many argument\n");
return 1;
}
FILE *fr;
char *file_name = calloc(strlen(argv[1]),sizeof(char));
strncpy(file_name,argv[1],strlen(argv[1]));
fr = openFile(file_name);
printf("\nReading from file\n");
readFile(fr);
fclose(fr);
free(file_name);
return 0;
}
Я скомпилировал код, используя следующую команду
gcc -g3 -Wall fmain.c -o file.o
Когда я запустил код
./file.o "~/workspaces/myWork/C_experiment/test.txt"
я вижу Segmentation fault: 11
Но когда я запускаю вышеуказанную программу в lldb, я работаю и выхожу с кодом возврата 0.
lldb ./file.o
(lldb) run "~/workspaces/myWork/C_experiment/test.txt"
// output of the file
Process 28806 exited with status = 0 (0x00000000)
(lldb) quit
Теперь я понятия не имею, как отладить код и найти причину Seg Fault.
.o
заставляет меня сомневаться в правильности этой команды. - person Ruslan   schedule 10.03.2017openFile
успешно. ЕслиopenFile
не может открыть файл (например, потому что он не существует), он возвращаетNULL
, аreadfile
будет демонстрировать неопределенное поведение (скорее всего, сбой). Скорее всего проблем больше. - person Jabberwocky   schedule 10.03.2017char *buffer = calloc(sizeof(char),1);
бессмысленно, если размер буфера известен во время компиляции, пишите простоchar buffer[1]
(что в любом случае неверно, см. ответ ниже). - person Jabberwocky   schedule 10.03.2017#ifndef __file_h__
идентификаторы, начинающиеся с одного (или двух) символов подчеркивания, зарезервированы. Не используйте их. Просто не надо. - person joop   schedule 10.03.2017