所以我需要编写一个带有以下编译标志的代码:
gcc-ansi-pedantic-Wall
全部基于Linux的操作系统。输出程序应该打印自己的源代码。如果我更改输出文件名,并且文件夹中有一个同名的C文件,它将打印其内容。
到目前为止,我设法做到了这一点:
#include <stdio.h>
int main()
{
char c;
FILE *my_file = fopen(__FILE__, "r");
while (c != EOF)
{
c = fgetc(my_file);
putchar(c);
}
fclose(my_file);
return 0;
}
但是,如果我更改文件名和C文件名,就会出现错误。示例:对于文件:prnt.c,prnt
Consule -> os/23$ ./prnt
#include <stdio.h>
int main()
{
char c;
FILE *my_file = fopen(__FILE__, "r");
while (c != EOF)
{
c = fgetc(my_file);
putchar(c);
}
fclose(my_file);
return 0;
}
对于相同的文件,在我将名称更改为test.c后,测试(不编译(
/os/23$ ./test
Segmentation fault (core dumped)
之所以会发生这种情况,是因为__FILE__宏,编译后会更改为原始文件名。问题是我该如何解决这个问题?
所以我查看了Paul Hankin的建议,我设法解决了这个问题。希望将来它能帮助到别人。
我的解决方案:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
/*
This program prints the source code
of the 'C' file with the same name in the
same directory.
*/
char c = 'a'; /* Initialization before while loop.*/
char* locat = argv[0]; /* The path to the program file.*/
char suff[3] = ".c ";
FILE* my_file;
strcat(locat, suff); /* Doesn't work for Windows.*/
my_file = fopen(locat, "r");
while (c != EOF)
{
c = fgetc(my_file);
putchar(c);
}
fclose(my_file);
return 0;
}