当我从 makefile 运行 时,C- fopen 无法正常工作
C- fopen doesn't work properly when I run from makefile
我为 运行 我的代码编写了一个简单的 makefile,因为我被要求作为可交付成果这样做
我在我的代码中使用 fopen,当我 运行 来自 clion 的代码时,它通常会找到我需要的文件,但是当我 运行 来自 makefile 的代码时,它告诉我它无法找到文件
(我的输出总是打印“找不到 ../a.txt”)
-负责读取的函数(它运行正常,如果我运行它在clion中它可以找到文件)
它存在于 IO.c
void readPar(char *f, int *para) {
FILE *file = fopen(f, "r");
if (file == NULL) {
printf("Couldn't find %s\n", f);
exit(-1);
}
fscanf(file, "row=%d col=%d", ¶[0], ¶[1]);
fclose(file);
}
-我的主要(叫matMultp.c)
int main(int argN, char **argS) {
char files[3][200] = {"../a.txt", "../b.txt", "../c.out"}; //default filenames
if (argN > 1) { //if some argN was inserted
for (int i = 1; i < argN; i++) {
strcpy(files[i-1],"../");
strcat(files[i-1],argS[i]);
if(i==3)strcat(files[i-1],".out");
else strcat(files[i-1],".txt");
}
}
int para1[2] ;
readPar(files[0],para1);
return 0;
}
-makefile
CC=gcc
CFLAGS=-Wall -pthread -Wextra -g -Wstack-usage=1000 -fstack-usage
LDLIBS= -lpthread
all: matMultp
matMultp: matMultp.o matUtils.o IO.o
matMultp.o: matMultp.c
matUtils.o : matUtils.c matUtils.h
IO.o : IO.c IO.h
clean:
rm -rf $(EXECUTABLE) $(OBJ)
如果你想要我的文件夹的 ls :
a.txt b.txt cmake-build-debug CMakeLists.txt
dockDockBuildParams.json IO.c IO.h IO.o IO.su
makefile matMultp matMultp.c matMultp.o matMultp.su
matUtils.c matUtils.h matUtils.o matUtils.su tests
试试这个,看看你是否明白答案:
void readPar(char *f, int *para) {
FILE *file = fopen(f, "r");
if (file == NULL) {
printf("Couldn't find %s/%s\n", get_current_dir_name(), f);
exit(-1);
}
fscanf(file, "row=%d col=%d", ¶[0], ¶[1]);
fclose(file);
}
您可能还需要添加 #include <unistd.h>
。
我为 运行 我的代码编写了一个简单的 makefile,因为我被要求作为可交付成果这样做 我在我的代码中使用 fopen,当我 运行 来自 clion 的代码时,它通常会找到我需要的文件,但是当我 运行 来自 makefile 的代码时,它告诉我它无法找到文件 (我的输出总是打印“找不到 ../a.txt”)
-负责读取的函数(它运行正常,如果我运行它在clion中它可以找到文件) 它存在于 IO.c
void readPar(char *f, int *para) {
FILE *file = fopen(f, "r");
if (file == NULL) {
printf("Couldn't find %s\n", f);
exit(-1);
}
fscanf(file, "row=%d col=%d", ¶[0], ¶[1]);
fclose(file);
}
-我的主要(叫matMultp.c)
int main(int argN, char **argS) {
char files[3][200] = {"../a.txt", "../b.txt", "../c.out"}; //default filenames
if (argN > 1) { //if some argN was inserted
for (int i = 1; i < argN; i++) {
strcpy(files[i-1],"../");
strcat(files[i-1],argS[i]);
if(i==3)strcat(files[i-1],".out");
else strcat(files[i-1],".txt");
}
}
int para1[2] ;
readPar(files[0],para1);
return 0;
}
-makefile
CC=gcc
CFLAGS=-Wall -pthread -Wextra -g -Wstack-usage=1000 -fstack-usage
LDLIBS= -lpthread
all: matMultp
matMultp: matMultp.o matUtils.o IO.o
matMultp.o: matMultp.c
matUtils.o : matUtils.c matUtils.h
IO.o : IO.c IO.h
clean:
rm -rf $(EXECUTABLE) $(OBJ)
如果你想要我的文件夹的 ls :
a.txt b.txt cmake-build-debug CMakeLists.txt
dockDockBuildParams.json IO.c IO.h IO.o IO.su
makefile matMultp matMultp.c matMultp.o matMultp.su
matUtils.c matUtils.h matUtils.o matUtils.su tests
试试这个,看看你是否明白答案:
void readPar(char *f, int *para) {
FILE *file = fopen(f, "r");
if (file == NULL) {
printf("Couldn't find %s/%s\n", get_current_dir_name(), f);
exit(-1);
}
fscanf(file, "row=%d col=%d", ¶[0], ¶[1]);
fclose(file);
}
您可能还需要添加 #include <unistd.h>
。