日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统实践(二)

發布時間:2025/3/15 windows 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统实践(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??本節課的主要內容是:文件讀寫。在C語言中,我們可以使用fopen,fclose等函數進行文件操作。但下放到操作系統層次,就是一些文件的系統調用了。本節的主要內容也就是介紹下與文件相關的一些系統調用。
??我發現自己寫的,遠沒有老師提供的資料全面。所以在這里,我就直接用圖片說明內容啦~







??以上就是本節的主要理論學習內容,下面還有三個作業進行鞏固,我就把自己的答案附在上面,可能不是很簡潔,但我后面會慢慢的進行修改完善滴~

一、練習一:

#include<stdio.h> int main(int argc, char *argv[]) {// argc的參數計算是從頭開始的,所以使用./a.out也算一個,真正的參數是從索引1開始for (int i=1; i<argc; i++) {// argv是指針數組,使用的時候要注意。因為這里面測試的樣例是字符,所以用%s和%c都可以//但是puts不可以,puts輸出的只能是常量字符串printf("%s ", argv[i];printf("%c ", *(argv[i]));// puts(argv)}printf("\n"); }

??寫這個的時候,遇到這樣一個直接的問題:不定參數如何輸入?原來在main函數中,它的參數列表就可以作為它的不定輸入。設定argc和argv。其中argc代表輸入參數個數,argv代表輸入參數內容。更為詳細的內容的可以參考:https://www.cnblogs.com/x_wukong/p/5326557.html

??還有就是,輸出的時候會出現一種這樣的情況:輸出的最后總是有個%,這是怎么回事呢?其實這個就是Linux下一個習慣,提示輸出到了最后。如果不想要的話,可以在最后增加一個換行符(這個問題困擾了我很久,感謝https://segmentfault.com/q/1010000004687388)

二、練習二:


??思路:因為文件內內容長度的不確定性,不想數據庫那樣有嚴格的結構體。這里利用read讀文件如果到文件底會返回0做判斷,同時read返回值就是文件讀出來的字節count改變偏移量offset。以offset作為lseek偏移數,不斷累加,進行讀取。源碼如下:

#include<fcntl.h> #include<unistd.h> #include<stdio.h> #include<string.h> #include<stdlib.h>// 輸出錯誤提示信息 void panic(char *message) {perror(message);exit(EXIT_FAILURE); }int fd;struct record {char content[100]; };// 打開文件,使用系統調用open void db_open(char *path) {mode_t mode = 0777;fd = open(path, O_RDWR | O_APPEND | O_CREAT, mode);if (fd < 0)panic("open"); }// 關閉文件,使用系統調用close void db_close() {close(fd); }// 文件內容輸出,使用系統調用lseek,read void db_dump() {int offset = 0;while (1) {lseek(fd, offset, SEEK_SET);struct record record;int count = read(fd, &record, 100);if (count == 0)break;else {offset += count;printf("%s\n", record.content);}} }int main(int argc, char *argv[]) {db_open(argv[1]);db_dump();db_close();return 0; }

??效果圖如下:

三、練習三:


??思路:讀取文件部分與問題二一致,同時增加寫文件部分,文件名為第二個傳入的參數值。源代碼如下(代碼是有問題的,問題在下面說):

#include<fcntl.h> #include<unistd.h> #include<stdio.h> #include<string.h> #include<stdlib.h>// 輸出錯誤信息 void panic(char *message) {perror(message);exit(EXIT_FAILURE); }int fd_source; int fd_target;struct record {char content[100]; };// 打開源文件 void db_open_source(char *path) {mode_t mode = 0777;fd_source = open(path, O_RDWR | O_APPEND | O_CREAT, mode);if (fd_source < 0)panic("open_source"); }// 生成目標文件 void db_open_target(char *path) {mode_t mode = 0777;fd_target = open(path, O_RDWR | O_APPEND | O_CREAT, mode);if (fd_target < 0)panic("open_target"); }void db_close() {close(fd_source);close(fd_target); }// 目標文件內容填入(尾部填充) void db_append(char *content) {struct record record;strcpy(record.content, content);int count = write(fd_target, &record, 100);if (count < 0)panic("write"); } // 從源文件讀,向目標文件寫 void db_dump() {int offset = 0;int num = 0;while (1) {lseek(fd_source, offset, SEEK_SET);struct record record;int count = read(fd_source, &record, sizeof(record));if (count == 0)break;else {offset += count;db_append(record.content);printf("%s", record.content);}}printf("\n"); }int main(int argc, char *argv[]) {db_open_source(argv[1]);db_open_target(argv[2]);db_dump();db_close();return 0; }

??問題:這個代碼在執行的時候,在終端輸出的是沒有問題的。但寫入到目標文件中的內容,最終會出現一行亂碼(長度恰好是100),如下圖:

??有問題是好事,等我解決了,再補充說明吧~

??呼,第二次實驗結束,繼續加油!

因作者水平有限,如有錯誤之處,請在下方評論區指出,謝謝各位!

總結

以上是生活随笔為你收集整理的操作系统实践(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。