使用write()将char*从用户输入写入文件

使用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)

我试图编写一个函数,从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)
                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++);