lseek计算文件长度(现在的免编程软件制作,都会对用户的数据进行加密和隐藏吗)

本文目录
现在的免编程软件制作,都会对用户的数据进行加密和隐藏吗
系统调用:用户通过操作系统提供的接口(API)获得内核提供的一些服务
程序的运行空间逻辑上是分离的,分为内核空间和用户空间。
用户进程通常情况下无法访问内核空间。
所有的进程会在内核中有一个文件记录表,记录表是有限的。
文件描述符是一个非负整数,是一个索引值,指向内核空间每个进程的记录表
Linux一点哲学,一切皆为文件(包括输入输出设备);
故标准输入STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
常用系统调用函数
int creat(const char *filename,mode_t mode)
filename:创建的文件名称(包含路径,缺省为当前路径)
mode:创建模式,
读 S_IRUSR S_IRGRP S_IROTH
写 S_IWUSR S_IWGRP S_IWOTH
执行 S_IXUSR S_IXGRP S_IXOTH
或者用数字:0644 0为8进制 1 读 2 写 3 4执行
int open (const char* pathname, int flag,mode_t mode)
open函数,pathname为文件名,flag 为打开方式(整型变量)
flag: O_CREAT |O_EXCL 不存在即创建,存在即报错
O_NONBLOCK 非阻塞方式打开(例如使用read函数读取空文件时,阻塞方式是等到对空白文件输入时才会返回)
O_TRUNC 把打开的文件长度截断为零 (清空)
O_RDONLY O_WRONLY O_RDWR O_APPEND 以只读/只写/读写/追加(写方式,并定位到文件末尾开始写)打开
与open函数成对出现的是close函数,文件打开后若不关闭,文件一直处于打开的状态
int close (int fd) 成功关闭返回零,否则返回-1出错
int read (int fd, const void *buf, size_t length)
从fd 指向的文件中读出length长度的字符到buf中(缓冲区),返回值为实际读取的字节数,
遇到文件结束符EOF,返回零(会出现部分读问题)
int write (int fd, const void *buf, size_t length)
与read类似,也会出现部分写问题,需要注意
定位函数
int lseek (int fd, offset_t offset, int whence)
将文件读写指针相对whence移动offset个字节,返回文件指针相对于文件头的位置
whence :SEEK_SET 文件开头 SEEK_SUR 相对文件读写指针的当前位置
SEEK_END 文件尾
offset可为负值,表示向前移动。(可通过lseek函数计算文件长度)
补充:memset函数
memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:
void *memset(void*,int,unsigned);
其中void*表示地址 memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。
系统调用与API的区别
在
linux
中,将
程序
的运行空间分为内核与
用户空间
(内核态和用户态),在逻辑上它们之间是相互隔离的,因此
用户程序
不能访问内核数据,也无法使用内核
函数
。
具体步骤:用户进程--》
系统调用
--》内核--》返回用户空间。
系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”。
系统调用规定用户进程进入
内核空间
的具体位置。
1.程序运行空间从用户空间进入内核空间。
2.处理完后再返回
用户空间
。
3.什么是API
答:api 就是
应用程序
接口,是一些预定义的函数。跟内核没有必然的联系。API(Application Programming Interface)应用程序接口,是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
4.两者的区别。
答:区别:api是函数的定义,规定了这个函数的功能,跟内核无直接关系。而系统调用是通过
中断
向内核发请求,实现内核提供的某些服务。
联系:一个api可能会需要一个或多个系统调用来完成特定功能。通俗点说就是如果这个api需要跟内核打交道就需要系统调用,否则不需要。
程序员
调用的是API(
API函数
),然后通过与系统调用共同完成函数的功能。
因此,API是一个提供给
应用程序
的接口,一组函数,是与
程序员
进行直接交互的。
系统调用则不与
程序
员进行交互的,它根据API函数,通过一个软
中断
机制向内核提交请求,以获取内核服务的接口。
并不是所有的API函数都一一对应一个系统调用,有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些
API函数
不需要调用相应的
系统调用
(因此它所完成的不是内核提供的服务)
linux中,什么函数可以读取目录
LINUX下历遍目录的方法一般是这样的
打开目录-》读取-》关闭目录
相关函数是
opendir -》 readdir -》 closedir
#include 《dirent.h》
DIR *opendir(const char *dirname);
#include 《dirent.h》
struct dirent *readdir(DIR *dirp);
#include 《dirent.h》
int closedir(DIR *dirp);
好了,三个函数都出来了呵呵,原型就是上面,给自己解释一下免得以后我自己忘了呵呵!我以经忘过好几回了,所以这次放上博客来
opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针他的参数*dirname是一个字符数组或者字符串常量,
readdir函数用于读取目录,他只有一个参数,这个参数主opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *
dirent的结构如下定义
struct dirent
{
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name ; /* file name (null-terminated) */
}
结构体中d_ino存放的是该文件的结点数目,什么是结点数目呢我也说不清楚了呵呵,查一下其它资料了
d_off 是文件在目录中的编移,具体是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是2回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大.最后一个元素就是我们要的了,文件名称!
写了一个实例:
/**
* 功能: Linux下C语言目录历遍 (读取目录)
* 作者: 小徐
* 邮箱: xjtdy888@163.com
* QQ: 339534039
* 转载请注明出处
*/
#include 《stdio.h》
#include 《stdlib.h》
#include 《sys/types.h》
#include 《unistd.h》
#include 《dirent.h》
void print_usage(void);
void print_usage(void)
{
printf("Usage: test dirname\n");
}
int main(int argc,char *argv)
{
DIR * dp;
struct dirent *filename;
if (argc 《 2)
{
print_usage();
exit(1);
}
dp = opendir(argv);
if (!dp)
{
fprintf(stderr,"open directory error\n");
return 0;
}
while (filename=readdir(dp))
{
printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",
filename-》d_name,filename-》d_ino,filename-》d_reclen);
}
closedir(dp);
return 0;
}
将上面代码保存为readdir.c执行下面的命令进行编译测试
# gcc readdir.c
# ./a.out
Usage: test dirname
# ./a.out /etc/samba/
filename:lmhosts d_info:49296 d_reclen:24s
filename:smb.conf d_info:49825 d_reclen:24s
filename:smbpasswd d_info:49402 d_reclen:24s
filename:.. d_info:47906 d_reclen:16s
filename:secrets.tdb d_info:49812 d_reclen:24s
filename:. d_info:49295 d_reclen:16s
filename:smbusers d_info:49377 d_reclen:24s
# ./a.out /var/
filename:preserve d_info:31971 d_reclen:24s
filename:lock d_info:31966 d_reclen:16s
filename:yp d_info:31976 d_reclen:16s
filename:empty d_info:31962 d_reclen:24s
filename:run d_info:31972 d_reclen:16s
filename:lib d_info:31939 d_reclen:16s
filename:nis d_info:31969 d_reclen:16s
filename:local d_info:31965 d_reclen:24s
filename:spool d_info:31973 d_reclen:24s
filename:tmp d_info:31941 d_reclen:16s
filename:opt d_info:31970 d_reclen:16s
filename:log d_info:31959 d_reclen:16s
filename:crash d_info:31997 d_reclen:24s
filename:.. d_info:2 d_reclen:16s
filename:account d_info:32037 d_reclen:24s
filename:mail d_info:31968 d_reclen:16s
filename:cache d_info:31960 d_reclen:24s
filename:db d_info:31961 d_reclen:16s
filename:. d_info:31938 d_reclen:16s
#
程序正常执行!到此完了呵呵!!
求个C++程序(急急急):编写两个函数,分别找出一个文本文件中长度最长和最短的行
我在linux下测试通过了,是要你的文本文件不太大的话,完全没有问题。
#include 《iostream》
#include 《string.h》
#include 《cstdlib》
#include 《fcntl.h》
using namespace std;
typedef unsigned char uchar;
int fd;
uchar buf ;
int count_file_len(int fd)
{
int len = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
return len ;
}
int count_line(int fd)
{
int len = count_file_len(fd);
read(fd,buf,len);
uchar* p = buf;
int count_n = 0 ;
while(*p++){
if( *p == ’\n’ )
count_n++;
}
return count_n ;
}
int inline count_line_len(int n)
{
int this_line_len = 0;
int i = 0;
uchar *p = buf;
while( *p++ ){
if(*p == ’\n’ )
i++;
if( i == n )
break;
}
while( *p-- && *p !=’\n’){
this_line_len++ ;
}
return this_line_len;
}
int get_max_len(int fd)
{
int i ,len = count_file_len(fd);
int maxlen = count_line_len(1);
int maxlenno = 0;
read(fd,buf,len);
for( i = 1; i 《= count_line(fd) ; i++){
len = count_line_len(i);
if( maxlen 《 len ){
maxlenno = i;
maxlen = len;
}
}
cout《《" the line who has max len = "《《maxlenno《《endl;
return maxlen ;
}
int get_min_len(int fd)
{
int i ,len = count_file_len(fd);
int minlen = count_line_len(1);
int minlenno = 0;
read(fd,buf,len);
for( i = 1; i 《= count_line(fd) ; i++){
len = count_line_len(i);
if( minlen 》 len ){
minlenno = i;
minlen = len;
}
}
cout《《" the line who has min len =" 《《minlenno《《endl;
return minlen ;
}
int main(int argc,char* argv)
{
fd = open(argv,O_RDWR);
if( fd 《 0 )
cout《《"open error !"《《endl,exit(-1);
cout《《"open %s success!"《《argv《《endl;
cout《《"your file length = "《《count_line(fd) 《《endl;
cout《《"max len = "《《get_max_len(fd)《《endl;;
cout《《"min len = "《《get_min_len(fd)《《endl;;
}

更多文章:
118论坛手机打不开了怎么回事?118图118论坛网址怎么变成卖茶叶的
2025年6月9日 10:45
西安abap开发培训(SAP ABAP培训,ABAP培训怎么样)
2025年12月31日 01:00
loopback下载(如何在ubuntu命令行下下载kvm)
2026年4月9日 08:30
security video(bios setup utility怎么设置开机密码 不是登陆密码啊)
2026年1月30日 08:00
asp session用法(关于ASP.NET中session的用法)
2026年5月16日 08:30
斯莱德男装品牌倒闭了(jj,马华,esprit,斯莱德,zara,美邦,这几个品牌如何评价)
2026年7月10日 12:30
covered interest rate parity(Interest Rate Parity代表什么)
2026年2月19日 06:00
特斯拉model3百公里加速(model3百公里加速是多少)
2026年1月18日 10:00
php执行mysql语句(php连接mysql数据库,执行查询语句后,排序后再输出)
2025年11月5日 18:30












