導航:首頁 > 文件教程 > 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讀文件相關的資料

熱點內容
qq動畫圖片大全大圖 瀏覽:83
編程有哪些好用的工具 瀏覽:273
四川網站名片多少錢 瀏覽:228
刪除一個文件的linux命令 瀏覽:335
韓國追星妹子愛用的app 瀏覽:77
cad圖紙解壓後文件會變小嗎 瀏覽:531
觀宇軒是什麼購物網站 瀏覽:264
會聲會影字體安裝在哪個文件夾 瀏覽:71
數控編程如何解決重復輸入 瀏覽:477
數控編程圓弧用什麼刀 瀏覽:202
note4換home鍵教程 瀏覽:80
mac裝的列印機驅動在哪個文件夾找到 瀏覽:433
win10系統的殺毒軟體 瀏覽:47
如何鎖網路頻率 瀏覽:65
683版本飛機 瀏覽:96
通達信的畫線工具在哪個文件 瀏覽:153
systemsres是什麼文件 瀏覽:224
90版本dnf釋魂是黃字嗎 瀏覽:354
口袋妖怪最新版本游戲 瀏覽:199
linuxyum升級軟體包 瀏覽:463

友情鏈接