使用write()将char*从用户输入写入文件
我试图编写一个函数,从stdin中获取一个路径,并将该路径保存到一个文件中。 尽管做了很多尝试,我还是对如何正确地做这件事失去了任何感觉。有人能告诉我怎么做吗? 这是我的代码:使用write()将char*从用户输入写入文件,c,system-calls,C,System Calls,我试图编写一个函数,从stdin中获取一个路径,并将该路径保存到一个文件中。 尽管做了很多尝试,我还是对如何正确地做这件事失去了任何感觉。有人能告诉我怎么做吗? 这是我的代码: void char_to_file(const char *pathname, const char *dest) { int fd_1; if (fd_1 = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666) == -1)
void char_to_file(const char *pathname, const char *dest)
{
int fd_1;
if (fd_1 = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666) == -1)
custom_error_shout("OPEN FD_1");
while (*(pathname) != '\0')
{
*(pathname++);
if (write(fd_1, &pathname, 1) == -1)
custom_error_shout("WRITE TO FILE");
}
if (close(fd_1) == -1)
custom_error_shout("CLOSE FD_1");
}
将创建该文件,但不会在其中写入任何内容。没有出现任何错误。您确实选择了艰难的方法。就像@tadman在评论中建议的那样,尝试以下方法:
void char_to_file(const char *pathname, const char *dest)
{
FILE *fp;
fp = fopen(dest, "w");
if (fp == NULL)
{
custom_error_shout("Something went wrong opening the file");
return;
}
if (fputs(pathname, fp) == EOF)
custom_error_shout("Something went wrong writing to the file");
fclose(fp);
}
未写入任何内容的原因是您将条件
打开(..)=-1
的结果重置为fd_1
,除非打开失败,否则结果将为0
(STDIN_FILENO
)。如果open()
确实失败并返回-1
,则fdu 1
将等于1
(STDOUT\u FILENO
)。因此,除非open()
失败,否则您正试图将写入stdin
这是因为您没有将作业用括号括起来,例如,if(fd_1=open()=-1)
——应该是if(fd_1=open())=-1)
。否则,=
(关系运算符)的值高于=
(简单赋值),并且打开(..)==-1
的结果被赋值给fd_1
要更正此问题,您需要:
if ((fd_1 = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1)
(注意:您对0666
的模式的选择将受系统umask
的约束,可能导致实际权限0644
。请参阅)
write
命令应传递第一个字符的地址,而不是指向该地址的指针,例如
if (write(fd_1, pathname, 1) == -1)
您应该启用编译器警告。例如,对于gcc/clang,使用-Wall-Wextra-pedantic
;对于VS,使用/W3
(对于其他编译器,请检查选项)。启用“警告”后,您将收到有关计算值未用于以下对象的警告:
要推进指针,只需使用pathname++代码>。如果未分配或未使用结果,则取消引用结果没有任何意义
如果pathname
或dest
中的字符串没有其他问题,并且错误宏工作正常,那么这应该可以解决问题。(注意,使用fopen
和像fputs()
这样的文件流操作更有意义)
如果您还有其他问题,请告诉我。为什么在文件*
上编写而不是fwrite
和朋友?
*(路径名++)
应该做什么?pathname++
就足够了吗?我甚至不知道你为什么要操纵那个指针,“将那个路径保存到文件”是什么意思?您是说“在给定路径复制文件内容”还是“将文本路径名复制到输出文件”?如果您正在将pathname
转储到一个文件中,为什么要逐字节写入,而不仅仅是write(fd_1,pathname,strlen(pathname))
?至少不要使用&pathname,这样会写入指针值的一个字节。文件运行多长时间?此外,在写入之前增加路径名,因此将丢失第一个字符,然后在末尾写入零字节。错误检查应为!=1.
*(pathname++);