⑴ linux用什么标识,描述和控制文件
Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在linux的C语言中,除了用通用的《【C】文件读写问题》(点击打开链)中介绍过的fopen等c语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符来操作他们。文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。至于这个东西怎么用,具体请看如下文件读写程序:#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>//文件控制#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXSIZE 512//缓冲区的大小const char* FILEPATH="/tmp/file.txt";//文件目录int main(void) { int fd;//文件标识符, char *s = "被折腾的文字"; char buffer[MAXSIZE+1];//用来接字符的缓冲区int size;//读入的文件长度 if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式//0777为最高权限 perror("打开文件失败!"); exit(1); } if((write(fd,s,strlen(s)))<0){ perror("写入文件失败!"); exit(1); } //lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处 lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符 if((size=read(fd,buffer,MAXSIZE))<0){ perror("读入文件失败!"); exit(1); }else{ buffer[size]='\0';//字符串数组封口 printf("%s\n",buffer); } if(close(fd)<0) { perror("关键文件失败!"); exit(1); } unlink(FILEPATH);//删除文件 exit(0);}这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。所以,上述代码的运行结果如下图:最后,这个文件自然是要被删除的了,肯定是没有的:上述程序很简单,但我们更多应该关注这里文件标识符的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。unlink函数则和文件标识符无关,需要一个文件路径的参数。
⑵ linux c语言如何快速知道函数的头文件
1、要用到unistd.h头文件。
2、Write函数用法:write函数所在的头文件为 <unistd.h>write有两种用法。一种是:ssize_twrite(int handle, void *buf, int nbyte);handle 是文件描述符;buf是指定的缓冲区,即指针,指向一段内存单元;nbyte是要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.另一种是:write(const char* str,int n)str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。write("string",strlen("string");表示输出字符串常量3、程序示例:
#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<sysstat.h>#include<io.h>#include<string.h>intmain(void){int*handle;charstring[40];intlength,res;/*Createafilenamed"TEST.$$$".If"TEST.$$$"alreadyexists,itwillbeoverwritten.*/if((handle=open("TEST.$$$",O_WRONLY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))==-1){printf("Erroropeningfile.");exit(1);}strcpy(string,"Hello,world!");length=strlen(string);if((res=write(handle,string,length))!=length){printf("Errorwritingtothefile.");exit(1);}printf("Wrote%dbytestothefile.",res);close(handle);return0;}
⑶ 用到strlen(函数,则应包含多少个头文件)
只需要 #include <string.h>
拓展资料:
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符''为止,然后返回计数器值(长度不包含'')。
⑷ 为什么在Linux中strlwr()不能编译通过,已经查看过<string.h>,的确在头文件中没有
strlwr和strupr都不是标准的C库函数!有些编译器不支持很正常,编译器不支持的,只能自己定义这两个函数并且用代码自己去实现它。个人使用过VC++2010,是可以编译通过的,证明VC++2010里边的编译器支持这两个函数。而linux中的GCC编译器则编译不通过,证明linux下的GCC编译器不支持这两个函数。