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);
程序的输出就会从原来的标准输出变成写入文件""中





