源码先锋

源码先锋

Linux(C/C++)下的文件操作open、fopen与freopen

admin 89 171

Linux(C/C++)下的文件操作open、fopen与freopen

open是linux下的底层系统调用函数,fopen与freopenc/c++下的标准I/O库函数,带输入/输出缓冲。

linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open。

所以在linux下如果需要对设备进行明确的控制,那最好使用底层系统调用(open),

open对应的文件操作有:close,read,write,ioctl等。

fopen对应的文件操作有:fclose,fread,fwrite,freopen,fseek,ftell,rewind等。

freopen用于重定向输入输出流的函数,该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。详细见第3部分。

-------------------------------------------------------------------------------------------------------------------

open和fopen的区别:

1,fread是带缓冲的,read不带缓冲.

2,fopen是标准c里定义的,open是POSIX中定义的.

3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.

4,fopen不能指定要创建文件的权限.open可以指定权限.

5,fopen返回文件指针,open返回文件描述符(整数).

6,linux/unix中任何设备都是文件,都可以用open,read.

-------------------------------------------------------------------------------------------------------------------

1、open系统调用(linux)

需要包含头文件:include

include

include

include

include

char*FILE_NAME="/home/hzg/uart/";

unsignedcharfile_buffer[20];

intmain()

{

FILE*file_fd;

intread_len,i;

file_fd=fopen(FILE_NAME,"rb");

if(file_fd==NULL)

{

perror("errno");

}

else

{

printf("FileOpensuccessed!\n");

}

while(1)

{

read_len=fread(file_buffer,1,16,file_fd);

if(read_len==-1)

{

printf("Filereaderror!\n");

perror("errno");

exit(0);

}

elseif(read_len==0)

{

printf("FilereadOver!\n");

break;

}

else

{

printf("Read%:",read_len);

for(i=0;iread_len;i++)

{

printf("%02x",file_buffer[i]);

}

printf("\n");

}

usleep(20000);

}

fclose(file_fd);

return0;

}

3、freopen

函数原型:FILE*freopen(constchar*filename,constchar*mode,FILE*stream);

参数:

filename:要打开的文件名

mode:文件打开的模式,和fopen中的模式(r/w)相同

stream:文件指针,通常使用标准流文件(stdin/stdout/stderr)

返回值:如果成功则返回该指向该stream的指针,否则为NULL。

作用:用于重定向输入输出流的函数,将stream中的标准输入、输出、错误或者文件流重定向为filename文件中的内容。linux下需要重定向输出很容易使用./程序名test(test追加),windows下的输入输出重定向可以使用freopen。

使用方法:因为文件指针使用的是标准流文件,因此我们可以不定义文件指针。

我们使用freopen()函数以只读方式r(read)打开输入文件,freopen("","r",stdin);

这样程序的输入就会从标准输入流stdin转换到从文件""中输入

然后使用freopen()函数以写入方式w(write)打开输出文件,freopen("","w",stdout);

程序的输出就会从原来的标准输出变成写入文件""中