导航:首页 > 文件教程 > unix读文件

unix读文件

发布时间:2023-02-09 20:34:16

『壹』 如何设置unix 文件读写缓冲模式

不带缓冲的 I/O 函数
术语不带缓冲指的是每个 read 或 write 都调用内核中的一个系统调用。这些不带缓冲的 I/O 函数不是 ISO C 的组成部分,但是,它们是POSIX.1 和 Single UNIX Specification 的组成部分。下面分别来说明一下5 个基本的函数:open、read、write、lseek 以及 close。
2.1 open 函数
调用 open 函数可以打开或者创建一个文件。
#include <fcntl.h>
int open(const char *pathname, int oflag, ... /* mode_t mode */);
返回值:若成功则返回文件描述符,若出错则返回-1.
其中第三个参数... 表明余下的参数的数量及其类型根据具体的调用会有所不同。对于 open 函数而言,仅当创建新文件时才使用第三个参数。pathname 是要打开或创建文件的名字。oflag 参数用于说明此函数的多个选项。用下列一个或多个常量进行“或”运算构成 oflag 参数(这些常量定义在 <fcntl.h> 头文件中)。
O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR 读、写打开
这三个常量中必须指定一个且只能指定一个。下列常量则是可选的:
O_APPEND每次写时都追加到文件的尾端。
O_CREAT若文件不存在,则创建它。使用此选项时,需要第三个参数 mode,用于指定该新文件的访问权限位。
O_EXCL如果同时指定了O_CREAT,而文件已经存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件。
O_TRUNC如果此文件存在,而且为只写或者读写成功打开,则将其长度截短为 0.
O_NOCTTY如果 pathname 指的是终端设备,则不将该设备分配为此进程的控制终端。
O_NONBLOCK如果指的是一个 FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本地打开操作和后续的 I / O 操作设置非阻塞模式。
例1:
下面程序以只读的方式打开文件 foo.txt,并设置 open 函数的O_CREAT和O_EXCL 选项。

#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int
main(void)
{
int fd;
if ((fd = open("foo.txt", O_RDONLY | O_CREAT | O_EXCL,S_IRUSR | S_IWUSR | S_IRGRP)) == -1) {
printf("open error\n");
} else {
printf("open success\n");
}
exit(0);
}

编译该程序,生成open_demo,然后执行它,其结果如下:

lienhua34:demo$ gcc -o open_demo open_demo.c
lienhua34:demo$ ls
open_demo
open_demo.c
lienhua34:demo$ ./open_demo
open success
lienhua34:demo$ ls -l foo.txt
-rw-r----- 1 lienhua34 lienhua34 0
8月 19 22:56 foo.txt
lienhua34:demo$ ./open_demo
open error

当指定了O_CREAT 选项时,第三个参数取下面列表中的这些常量的“或”运算结果用于指定新文件的访问权限(这些常量定义在 <sys/stat.h>中)。
表. 文件访问权限
S_IRUSR 用户 -读
S_IWUSR 用户 -写
S_IXUSR 用户 -执行
S_IRGRP 组 -读
S_IWGRP 组 -写
S_IXGRP 组 -执行
S_IROTH 其他 -读
S_IWOTH 其他 -写
S_IXOTH 其他 -执行

由 open 返回的文件描述符一定是最小的未用描述符数值。这一点可用于在标准输入、标准输出或标准出错输出上打开新的文件。
open 函数的 oflag 参数还支持三个可选常量,他们是 Single UNIXSpecification 中同步输入和输出选项的一部分。
O_DSYNC使每次 write 等待物理 I/O 操作完成,但是,如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新。
O_RSYNC使每一个以文件描述符作为参数的 read 操作等待,直至任何对文件同一部分进行的未决写操作都完成。
O_SYNC使每次 write 都等待物理 I/O 操作完成,包括由 write 操作引起的文件属性更新所需的I/O。
当文件用O_DSYNC 标志打开时,在重写其现有的部分内容时,文件时间属性不会同步更新。与此相反,如果文件是用O_SYNC 标志打开时,那么对该文件的每一次 write 操作都将在 write 返回之前更新文件时间。
2.2 creat 函数
可调用 creat 函数创建一个新文件。
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
返回值:若成功则返回以只写打开的文件描述符,若出错则返回-1.
此函数等效于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
creat 函数的一个不足之处是它以只写方式打开所创建的文件。之所以存在creat 函数,是因为早期的 UNIX 系统中,open 函数的第二个参数只能是0、1 或 2。没有办法打开一个尚未存在的文件,于是需要 creat 函数来创建新文件。现在 open 函数支持O_CREAT 选项之后,creat 函数就没有存在的必要了。
2.3 close 函数
调用 close 函数关闭一个打开的文件。
#include <unistd.h>
int close(int filedes);
返回值:若成功则返回0,若出错则返回-1.
当一个进程终止时,内核自动关闭它所有打开的文件。
2.4 read 函数
调用 read 函数从打开的文件中读数据。
#include <unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes);
返回值:若成功则返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1.
读操作从文件的当前偏移量处开始,在成功返回之前,该偏移量将增加实际读到的字节数。
2.5 write 函数
调用 write 函数想打开的文件写数据。
#include <unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes);
返回值:若成功则返回已写的字节数,若出错则返回-1.
对于普通文件,写操作从文件的当前偏移量处开始。如果在打开该文件时,制定了O_APPEND 选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。在一次成功写之后,该文件的偏移量增加实际写的字节数。
2.6 lseek 函数
调用 lseek 显示地为一个打开的文件设置其偏移量。
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
返回值:若成功则返回新的文件偏移量,若出错则返回-1.
每个打开的文件都有一个与其关联的“当前文件偏移量”。它通常是一个非负整数,用以度量从文件开始处计算的字节数。按系统默认的情况,当打开一个文件时,除非指定O_APPEND 选项,否则该偏移量被设置成 0.
对 lseek 函数的 offset 参数的解释与参数 whence 的值有关。
• 若 whence 是SEEK_SET,则将该文件的偏移量设置为距离文件开始处offset 个字节。
• 若 whence 是SEEK_CUR,则将该文件的偏移量设置为其当前值加 offset,offset 可为正或负。
• 若 whence 是SEEK_END,则将该文件的偏移量设置为文件长度家 offset,offset 可为正或负。
管道、FIFO 和网络套接字都不支持设置偏移量,如果一个文件描述符引用的是这三者之一,则 lseek 函数返回 -1,并将 errno 设置为 ESPIPE。对于普通文件,其偏移量只能是非负值。但是,某些设置可能支持负的偏移量。所以,在比较 lseek 函数的返回值时应当谨慎,不要测试它是否小于 0,而要测试它是否等于 -1.
文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞。位于文件中但没有写过的字节都被读为 0.
实例:
下面程序创建一个新文件 file.hole,先在文件开始处写入“abcd”,然后将文件偏移量移动到距离开始处的 10 字节处,在该处写入“ABCD”,则在文件 file.hole 从第 4 个字节处到第 9 个字节之间就形成了一个空洞。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
char buf1[] = "abcd";
char buf2[] = "ABCD";
int
main(void)
{
int fd;
if ((fd = open("file.hole", O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR | S_IRGRP)) < 0) {
printf("open error");
}
if (write(fd, buf1, 4) != 4) {
printf("write buf1 error");
}
if (lseek(fd, 10, SEEK_SET) == -1) {
printf("lseek error");
}
if (write(fd, buf2, 4) != 4) {
printf("write buf2 error");
}
exit(0);
}

编译该程序,生成文件 writedemo,然后执行 writedemo 文件,

lienhua34:demo$ gcc -o writedemo write_demo.c
lienhua34:demo$ ./writedemo
lienhua34:demo$ ls -l file.hole
-rw-r----- 1 lienhua34 lienhua34 14 8月 20 21:37 file.hole
lienhua34:demo$ od -c file.hole
0000000 a b c d \0 \0 \0 \0 \0 \0 A B C D
000001

『贰』 UNIX从标准输入读命令并执行

1.ash
(1)简介
ash --a shell
这是由Kenneth Almquist在1989年编写的,ash是linux下的许多命令解释器中的一个,它的许多特性接近于SYSTEM V的shell。
(2)部分参数说明
ash [ -efIijnsxz ] [ +efIijnsxz ] [ -c命令] [ 参数 ]
-c 命令:若用-c参数,则ash从标准输入中读入命令(在执行完-c带的命令之后)。
-s:若用-s参数,则ash从标准输入中读入命令(在执行完-c带的命令之后)。
如果不跟-c -s参数则ash以所跟的第一个参数为文件名,从此文件中读入命令。如无参数则ash缺省设定-s参数,从标准输入中读入命令,直到输入exit。
如果参数0的第一个字母是"-"则ash确定为login shell,ash将从/etc/profile或用户的根目录中的.profile读入相应的设置和环境变量。
-e:若用-e参数,则ash执行命令后返回值为非零值时则退出ash。
-f:若用-f参数,则ash关闭自动产生文件名功能。
-j:打开伯克利UNIX风格的工作控制。
-n:读入命令但是并不执行。
(3)范例
ash -c ls
ash执行ls这个命令后退回原先的目录和shell。
ash -s
ash执行一个新的shell,现在可以在这个shell中工作,按(Ctrl-D)或输入exit后,则退回原先的目录和shell,所设定的环境变量返回原先的值。
2.at
(1)简介
at,batch,atq,atrm:安排、检查、删除队列中的工作。
由Thomas Koenig编写。
(2)部分参数说明
at [-V] [-q队列] [-f文件名] [-mldbv] 时间
at -c 作业 [作业…]
atq [-V] [-q队列] [-v]
atrm [-V] 作业 [作业…]
batch [-V] [-q队列] [-f文件名] [-mv] [时间]
at在设定的时间执行作业。
atq列出用户排在队列中的作业,如果是超级用户,则列出队列中的所有工作。
atrm删除队列中的作业。
batch用低优先级运行作业,只要系统的loadavg(系统平均负载)<1.5(或者在atrun中设定的值)它就开始执行作业。
-V:若用-V参数,则显示版本号到标准错误输出。
-q队列:若用-q参数,则指定可选队列名称,队列名称可以是a到z或A到Z之间的任意字母。at的缺省队列名是c,batch的缺省队列名是E,队列的字母顺序越高,则队列的优先级越低。如果是大写字母的话则提交给batch,如果atq使用-q参数,则只显示这个队列中的作业。
-m:执行完作业后即使此作业并没有输也给提交作业的用户发送提示mail。
-f文件名:从文件中读取作业。
-l:等于atq。
-d:等于atrm。
-b:等于batch。
时间:这是用户设定的作业开始执行的时间。时间的格式分成三个部分:时间、日期、偏移量。可接受的时间形式是HHMM或HH:MM,在一天中指定的时间运行,如果时间过去了就在第二天执行。可以在时间后加入AM或PM使其在上午或下午运行,也可以指定在哪一天执行,给出日期的格式应为MMDDYY或MM/DD/YY或MM.DD.YY,也可以给出偏移量:
时间+计数时间间隔
时间间隔可以是minutes,hours,days,weeks。
也可以指定today让作业在今天执行,指定tommorow让作业在明天执行。
(3)注意事项
如果没有指定-f选项,是at从标准输入读入所有的命令,所以可以通过管道、重定向或交互输入来输入命令。
超级用户可以在任何情况下使用at系列的命令。一般用户使用at系列命令的权利由文件/etc/at.allow,/etc/at.deny控制。如果/etc/at.allow存在,则只有列在这个文件中的用户才能使用at系列的命令。如果/etc/at.allow文件不存在,则检查/etc/at.deny这个文件。只要不列在这个文件中的用户都可以使用at系列的命令。缺省的配置是/etc/at.deny,是一个空文件,这表明所有的用户都可以使用at系列的命令。
(4)范例
at -f work 4pm + 3 days
在三天后下午4点执行文件work中的作业。
at -f work 10am Jul 31
在七月31日上午10点执行文件work中的作业。
3.banner
banner:打印大标题。
banner在标准输出上打印高质量的标题,如果没有输入要打印的文字,则其等待从标准输入输入一行文字。其标题由"*"组成。由Mark Horton编写。
(2)部分参数说明
/usr/bin/banner [ -wn ]信息
-w宽度 输出宽度从131到n,n缺省为80列。
(3)注意事项
不能打印字符:< ,>,[,],\,^,_,{,},|,-。信息长度为10个英文字符,如果用空格分开字符串,还是连续打印字符串,两个字符串可以被括在引号(")中。这命名banner把这些字任串置于同一行中。
4.bash
(1)简介
bash:GNU Bourne-Again Shell
自由软件基金会(Free Software Foundation Inc)拥有bash版权。
bash是Linux下的许多命令解释器中的一个,同sh兼容,并且包含了ksh和csh中一些有用的特性。遵从IEEE Posix Shell and Tools specification(IEEE Working Group 1003.2)。

『叁』 在UNIX系统中,如何设定文件读写权限

1,文件属主,chown user.group 文件名
2,文件权限,1位,属主权限,2位,同组人权限,3位,其他人权限
每位上4读,2写,1执行,累加就可以了

比如一版个文件自己可以读写执权行,同组人读执行,其他人读那么就是754
7=4+2+1, 5=4+1,

更改权限命令chmod 754 文件名

『肆』 unix系统中,文件和目录的读权限是什么,没有权限会怎样

-rwxr-xr-x

r 是4 w是2 x是1,分别是可以读取,可以改写,可以执行

比如上面的权限就是所有者rwx,读写和执行,权限值为4+2+1=7
所有者同组的用户r-x,只能读和执行,权限值是4+1=5
其他用户权限是r-x,只能读和执行,权限值为4+1=5

所以它的权限也可以叫做755

『伍』 Unix下读取二进制文件的命令

hexmp
或者
od -x

---------------------------------------------------
我这里用hexmp可以,我是linux,可能使用的版本不同。
那就用 od -x 吧

『陆』 linux/unix C读取文件中的数字

假设该文件是文本方式
1、每次读一行,用fgets
2、假设都是以空格分隔,用sscanf从刚内才fgets读到的字符容串中取出一段
3、对其中的字符用isdigital判断是否都为数字,如果是,就atoi转换成数字,写入另一个文件
这样做就不需要操作文件指针,基本就是使用解析字符串格式的方法就可以了

『柒』 unix视频文件怎么打开

unix文件打开方式: 点击手机上的网络网盘APP进入, 页面跳转以后选择需要的登录方式登录进入该APP。页面跳转以后进入到网络网盘APP,点击底部的文件按钮,此时页面跳转以后可以看到对应的文件,点击进入。页面跳转以后进入到网络网盘APP,点击底部的文件按钮,此时页面跳转以后可以看到对应的文件,点击进入,页面跳转以后可以看到手机已经自动识别了相关的文件并将其打开了,再可以根据需要点击其他文件进入。

『捌』 在LINUX中能否读取UNIX硬盘中的文件

答案是肯定的,就不知你
Unix系统
硬盘是怎么分的区,以及分区的文件格式,是zfs吗?
在linux中输入命令:
ls
/dev/sd*
可以看见你
可以
挂载
或已经挂载的设备,前提是你把unix硬盘连在linux系统上,然后在用命令df
-h看看linux系统的文件系统,然后就可确定
unix硬盘的设备文件了,假如你要的资料在/dev/sdb3上
sudo
mount
-t
zfs
/dev/sdb3
/mnt
cd
/mnt
即可获取文件

『玖』 linux/unix C读取文件中的数字

假设该文件是文本方式
1、每次读一行,用fgets
2、假设都是以空格分隔,用sscanf从刚才fgets读到的字符串中取出一段
3、对其中的字符用isdigital判断是否都为数字,如果是,就atoi转换成数字,写入另一个文件
这样做就不需要操作文件指针,基本就是使用解析字符串格式的方法就可以了

『拾』 unix中while逐个读取文件

很高兴回答你的问题,while 语句其实是逐行读取文件。不知道你逐个读取文件想做什么操作。

提供给你一个参考,看看能否解决你的问题。

ls>file.list#将你想要读取的文件以每个一行的格式输入到file.list文件中

进行 while 的读取

#!/bin/sh
whilereadline
do
sed-i's/test/newtest/g'$line
#执行满足test的内容替换为newtest,将扫描所有file.list中的文件
#不知道你逐个读取文件是要做什么操作,cat?可以写成cat$line
done<file.list


希望对你有所帮助

阅读全文

与unix读文件相关的资料

热点内容
javadouble精度损失 浏览:308
手机截图女孩图标是什么app 浏览:168
有一行数据为什么不排序 浏览:535
直接调用js函数 浏览:835
天猫2045是什么网站 浏览:189
提取文件夹里所有word文件 浏览:288
隔空投送一次能传送多少个文件 浏览:347
拇指玩gpk文件安装器 浏览:475
肖战为那英打call数据是多少 浏览:699
网络优化的发展 浏览:719
3dmax打开高版本 浏览:177
文件字体一般多少 浏览:551
到哪里知道新发布的app 浏览:58
iphone用蓝牙鼠标 浏览:212
oracle数据库设置一对多关系 浏览:878
oracle数据库监听口令 浏览:658
win101511apr 浏览:128
word2007放大字体 浏览:28
app专用流量在哪里看 浏览:971
苹果耳机坏一边没声音 浏览:528

友情链接