低级别I/O-读取/创建/写入(C)
我试图在C中使用低级函数,并希望从STDIN中读取信息并将其存储在文件中低级别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)
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模式
参数。