我正在运行一个简单的程序来打开一个文件。有关操作系统和处理器的一些细节:
.Ubuntu 64bits
.Processor AMD Ryzen 7
每次我尝试执行时总是收到此错误:
No such file or directory
已经安装了 sudo apt-get install lib32z1 但问题依然存在。这是 C 程序的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
>
void main(void)
{
char* filename = "~/Documents/Manipulation/addresses.txt";
printf("\nUsing fopen fuction");
FILE* arch = fopen(filename, "r");
if(arch == 0)
{
perror("fopen");
printf("\n arch is null");
exit(0);
}
else
{
printf("\n Arch is opened..");
}
}
一个重要的细节是当我使用该功能时
open("addresses", O_RDONLY)
它运行良好。请参见下面的代码:
int fd;
printf("\nUsing open fuction");
fd = open ("addresses", O_RDONLY);
if(fd == 0)
{
fprintf(stderr, "can't open %s: %s\n", filename, strerror(errno));
exit(1);
}
else
{
printf("\n Arch is opened..");
}
有人知道如何解决这个问题吗?
如上评论所述,路径文字中的波浪字符不会被翻译成用户的主目录。您可能需要在 Linux 系统上执行的操作是检索当前用户主目录信息,如前一个解决方案中所述用户主目录.
利用此解决方案,以下是您的代码的重构版本。
#include <unistd.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
int main(void)
{
struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir;
char filename[200];
strcpy(filename, homedir);
strcat(filename, "/Documents/Manipulation/addresses.txt");
printf("\nUsing fopen fuction");
FILE* arch = fopen(filename, "r");
if(arch == 0)
{
perror("fopen");
printf("\n arch is null");
exit(0);
}
else
{
printf("\n Arch is opened..");
}
return 0;
}
注意添加了“unistd.h”和“pwd.h”包含文件。通过那一点重构,下面是程序的测试执行。
@Vera:~/C_Programs/Console/LinuxFile/bin/Release$ ./LinuxFile
Using fopen fuction
Arch is opened..
试试看它是否符合您项目的精神。