Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
低级别I/O-读取/创建/写入(C)_C_Low Level Io - Fatal编程技术网

低级别I/O-读取/创建/写入(C)

低级别I/O-读取/创建/写入(C),c,low-level-io,C,Low Level Io,我试图在C中使用低级函数,并希望从STDIN中读取信息并将其存储在文件中 int dash, c; char buffer[1024]; if((dash = creat("file.txt", S_IRWXU)) < 0) perror("creat error"); while ((c = read(STDIN_FILENO, buffer, sizeof(buffer))) > 0) { if (write(dash, buffer, c) != c)

我试图在C中使用低级函数,并希望从STDIN中读取信息并将其存储在文件中

int dash, c;
char buffer[1024];
if((dash = creat("file.txt", S_IRWXU)) < 0)
    perror("creat error");
while ((c = read(STDIN_FILENO, buffer, sizeof(buffer))) > 0) {
    if (write(dash, buffer, c) != c)
       perror("write error");
int破折号,c;
字符缓冲区[1024];
如果((dash=creat(“file.txt”,S_IRWXU))<0)
perror(“创建错误”);
而((c=read(STDIN_FILENO,buffer,sizeof(buffer)))>0){
如果(写入(破折号、缓冲区、c)!=c)
perror(“写入错误”);
我在理解如何访问'file.txt'以将其打印到屏幕或存储到另一个文件时遇到问题。我是否会使用'read('file.txt',buffer,sizeof[buffer])

编辑 现在,在创建了“file.txt”之后,我想打开另一个文件,比如file1(argv[3]),并将“file.txt”转储到file1(agrv[3])。这样行吗

fd = open(argv[3], O_RDWR); //open 3rd arg for writing
fd_2 = open("file.txt", O_RDWR); //open created file
do {
     n = read(fd_2, buffer, sizeof(buffer));
     if (n < 0)
        perror("read error argv[2]"); //greater 0=succesful
     write(STDOUT_FILENO, buffer, n); // this is where I'm stuck
    } while (n == sizeof(buffer));
close(fd);
fd=open(argv[3],O_RDWR);//打开第三个arg进行写入
fd_2=open(“file.txt”,O_RDWR);//打开创建的文件
做{
n=读取(fd_2,缓冲区,sizeof(缓冲区));
if(n<0)
perror(“读取错误argv[2]”;//更大0=成功
write(STDOUT_FILENO,buffer,n);//这就是我被卡住的地方
}而(n==sizeof(buffer));
关闭(fd);
我现在打开了两个文件,但不知道如何将“file.txt”写入argv[3]。

用于获取文件描述符:

int fd = open("file.txt", O_RDWR);
然后您可以使用
read()
从该文件描述符读取,就像
STDIN\u FILENO
一样

c = read(fd, buffer, sizeof(buffer));

请确保在实际代码中检查两个函数的返回值。

尝试代码。将输入文件名作为第二个参数

#include<stdio.h>
#include<fcntl.h>

#define MAX_BUF_SIZE 512

int main(int argc, char **argv)
{
        int fd;
        int count,value;
        char buf[MAX_BUF_SIZE];

        if(argc < 2)
                fprintf(stderr, "Usage: a.out filename\n");
         else
        {
                 fd = open(argv[1], O_RDONLY);
                 if(fd < 0 )
                        fprintf(stderr, "Error In Opening File\n");
                else
                {
                        fprintf(stdout, "Enter No of bytes to read from file %s\n",argv[1]);
                        fscanf(stdin,"%d",&value);
                        printf("value %d\n",value);

                        count = read(fd,buf,value);
                        buf[count]='\0';

                        if(count <=0)
                                fprintf(stderr, "Error In Reading from file\n");
                        else if(count < value)
                                fprintf(stdout, "Partial read data is %s\n",buf);
                        else if(count == value)
                                fprintf(stdout, "Data is: \n%s\n",buf);
                        else
                                fprintf(stderr,"Error in read.");

                close(fd);
                }
        }
        return 0;
}
#包括
#包括
#定义最大尺寸512
int main(int argc,字符**argv)
{
int-fd;
int计数,值;
字符大小[最大大小];
如果(argc<2)
fprintf(stderr,“用法:a.out文件名\n”);
其他的
{
fd=打开(argv[1],仅限Ordu);
如果(fd<0)
fprintf(stderr,“打开文件时出错”);
其他的
{
fprintf(stdout,“输入从文件%s读取的字节数\n”,argv[1]);
fscanf(标准输入、%d、&value);
printf(“值%d\n”,值);
计数=读取(fd、buf、值);
buf[计数]='\0';

如果(如果使用
create()
,则计数),则清除文件的上一个内容;该内容为空。没有可读取的内容。但是如果是第一次使用“file.txt”,该怎么办正在写入,我应该仍然能够从中读取并将其内容复制到另一个文件,对吗?如果创建了该文件,则该文件为空。当然,如果愿意,您可以将零字节复制到另一个文件,但这是一个毫无意义的练习。在
create()之后
,在您将一些数据写入文件之前,文件中没有任何内容可读取。POSIX定义为:
create()
函数的行为应如下所示:
int creat(const char*path,mode_t mode){返回open(path,O_WRONLY | O|creat | O|TRUNC,mode)}
因此,当您使用
creat()
时,文件描述符是不可读的。因此,如果我在creat()中使用“S_IRWXU”作为我的模式,我是否必须打开()才能将()写入其中?谢谢您的帮助。使用
creat()
,文件是为写入而打开的(仅限于;您无法从该文件描述符读取),并且文件是空的(直到你写了一些东西)。通常,
create()
系统调用现在没有使用;它仍然存在,因为很多年前在获取
O_create
和相关标志之前它是必需的。scanf是低级功能吗?@MBan:我已经更新了我的代码。谢谢你提醒我。
open
fopen
之间的区别,reffer:我总是建议设置e
模式
参数。