Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我想通过管道将一个文件中的文本写入另一个文件_C - Fatal编程技术网

C 我想通过管道将一个文件中的文本写入另一个文件

C 我想通过管道将一个文件中的文本写入另一个文件,c,C,下面是我为上述任务编写的代码,但输出文件显示了一个奇怪的输出。还有,有没有办法通过系统调用(write()、read(),等等)来实现这一点,我混合了系统调用和C语言函数,但是如果有人只想通过系统调用来实现,那么代码会是什么呢?提前感谢!:) #包括 #包括 #包括 #包括 #包括 #定义缓冲区大小512 #定义读取结束0 #定义WRITE_END 1 内部主(空) { 国际目的地论坛; 文件*输入; 字符写入消息[缓冲区大小]; 字符读取消息[缓冲区大小]; 用字节读,用字节写; int-fd

下面是我为上述任务编写的代码,但输出文件显示了一个奇怪的输出。还有,有没有办法通过系统调用(write()、read(),等等)来实现这一点,我混合了系统调用和C语言函数,但是如果有人只想通过系统调用来实现,那么代码会是什么呢?提前感谢!:)

#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小512
#定义读取结束0
#定义WRITE_END 1
内部主(空)
{
国际目的地论坛;
文件*输入;
字符写入消息[缓冲区大小];
字符读取消息[缓冲区大小];
用字节读,用字节写;
int-fd[2];
如果(管道(fd)=-1)
{
printf(“无法创建管道\n”);
返回-1;
}
pid_t pid;
pid=fork();
如果(pid==-1)
{
printf(“无法创建进程\n”);
返回-1;
}
如果(pid>0)
{
fpinput=fopen(“input.txt”,“r”);
如果(fpinput==NULL)
{
printf(“无法打开和读取文件\n”);
返回-1;
}
int i=0;
而(!EOF){
写入消息[i]=fgetc(fpinput);
++一,;
}
关闭(fd[READ_END]);
写入(fd[写入结束]、fpinput、缓冲区大小);
关闭(fd[写入结束]);
fclose(fpinput);
等待(空);
}
如果(pid==0)
{
destination_fd=open(“copy.txt”,O_CREAT | O_WRONLY | O_TRUNC,0700);
如果(目的地_fd==-1)
{
printf(“无法打开并写入文件\n”);
返回-1;
}
关闭(fd[写入结束]);
读取(fd[读取结束]、读取消息、缓冲区大小);
关闭(fd[READ_END]);
BytesWrite=写入(目的地fd、读取消息、缓冲区大小);
关闭(目的地_fd);
}
返回0;
}
您有多个问题

首先,您要问的问题是:您似乎在子进程中收到“垃圾”。这是因为您试图读入缓冲区
write_message
,但随后将
文件
结构
fpinput
写入管道


第二个问题是,您实际上不会读取任何内容,因为
而(!EOF)
永远不会迭代。符号常量
EOF
将替换为整数
-1
,并且在应用逻辑求反运算符
它的值
0
为false

我建议你修改你的循环,例如

int i = 0;
while ((write_message[i] = fgetc(fpinput)) != EOF)
{
    ++i;
}
或许

for (size_t i = 0; i < BUFFER_SIZE && (write_message[i] = fgetc(fpinput)) != EOF; ++i)
{
}
for(size\u t i=0;i
第二个循环还包括缓冲区溢出保护。

您有多个问题

首先,您要问的问题是:您似乎在子进程中收到“垃圾”。这是因为您试图读入缓冲区
write_message
,但随后将
文件
结构
fpinput
写入管道


第二个问题是,您实际上不会读取任何内容,因为
而(!EOF)
永远不会迭代。符号常量
EOF
将替换为整数
-1
,并且在应用逻辑求反运算符
它的值
0
为false

我建议你修改你的循环,例如

int i = 0;
while ((write_message[i] = fgetc(fpinput)) != EOF)
{
    ++i;
}
或许

for (size_t i = 0; i < BUFFER_SIZE && (write_message[i] = fgetc(fpinput)) != EOF; ++i)
{
}
for(size\u t i=0;i

第二个循环还包括缓冲区溢出保护。

非常感谢