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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件逆顺输出到新文件(三种方案)

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件逆顺输出到新文件(三种方案) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方法一:利用遞歸

/*功能:文件以行為單位,逆順輸出到新文件示例:file1.txt為:123456要求逆順后輸出到文件file2.txt,結果為:563412*/#include <stdio.h> #include <string.h>// 遞歸讀取文件 void doread(FILE *fp1, FILE *fp2, int next) {char buf[1024] = {0};if(next && fgets(buf, 1024, fp1) != NULL)doread(fp1, fp2, next);else if(next)next = 0; // 讀到文件尾fwrite(buf, strlen(buf), 1, fp2); // 寫入新文件 }int run(char *infile, char *outfile) {FILE *fp1 = NULL, *fp2 = NULL;if( NULL == (fp1 = fopen(infile, "r")) || NULL == (fp2 = fopen(outfile, "w")) )return 0;doread(fp1, fp2, 1);fclose(fp1);fclose(fp2);return 1; }int main() {char infile[] = "file1.txt";char outfile[] = "file2.txt";run(infile, outfile);return 0; }


====================================================================================

方法二:利用鏈表(頭插入法)

考慮到逆序的思想就是后進先出,這與的功能非常相似,于是產生了下面這種解法:

/*功能:演示了將文件中的內容以行為單位,逆順輸出到另一文件思路:考慮到后進先出,采用類似于棧的思想 */ #include <stdio.h> #include <string.h> #include <stdlib.h>typedef struct _tagNode {char *line;struct _tagNode *next; }Node;Node* insert(Node *head, char *line) // 頭插法建立鏈表 {Node *p = malloc(sizeof(Node));p->line = malloc(strlen(line)+1);strcpy(p->line, line);p->next = head;head = p;return head; }void display(Node *head) {int i = 0;while(head){printf("L%d: [%s]\n", ++i, head->line);head = head->next;} }// 將文件中的內容以行為單位逆順輸出到另一文件 void reverse(FILE *fp1, FILE *fp2) {int i = 0;char line[1024] = {0};Node *head = NULL, *t = NULL;// 讀文件,建立鏈表while(fgets(line, 1024, fp1) != NULL) // fgets默認會將換行符讀入到line中{if(line[strlen(line)-1] == '\n') // 最后一個是換行符line[strlen(line)-1] = 0;//printf("L%d: [%s]\n", ++i, line);head = insert(head, line); // 頭插法建立鏈表} // display(head);// 順序讀取鏈表,輸出內容到文件,并釋放結點while(head){fprintf(fp2, "%s\n", head->line); // 將內容寫入輸出文件t = head; // t指向要刪除的結點head = head->next; // head后移free(t->line);free(t);} }int main() {FILE *fp1, *fp2;char fin[] = "a.txt", fout[] = "a_out.txt";fp1 = fopen(fin, "r");fp2 = fopen(fout, "w");if(fp1 == NULL || fp2 == NULL){printf("Open file error\n");return 1;}reverse(fp1, fp2); // 將文件中的內容以行為單位逆順輸出到另一文件fclose(fp1);fclose(fp2);return 0; }

==================================================================================================

方法三:利用內存映射

/*功能:利用內存映射將文件中的內容以行為單位,逆順輸出到另一文件說明:如果最后一行無換行符,在輸出文件中會被添加上去(否則會與第二行連在一起) */ #include <sys/mman.h> /* for mmap and munmap */ #include <sys/types.h> /* for open */ #include <sys/stat.h> /* for open */ #include <fcntl.h> /* for open */ #include <unistd.h> /* for lseek and write */ #include <stdio.h>// 以行為單位,將mapped_mem中的內容逆順輸出到文件fout void reverse(char *mapped_mem, int flen, int fout) {char *p, *t;t = p = mapped_mem + flen - 1; // p指向內容的最后一個字節if(*p != '\n' && *p != '\0') // 最后一個字節不是換行符或0t = p + 1;p--;while(p >= mapped_mem) // 從末尾向前掃描{while(p >= mapped_mem && *p != '\n')p--;write(fout, p+1, t-p-1); // 將[p+1, t)的內容輸出到文件foutwrite(fout, "\n", 1); // 輸出換行符t = p--;}if(t == mapped_mem) // 第一行是空行{write(fout, "\n", 1);} }int main(int argc, char **argv) {int fd, fd_out;char *mapped_mem = NULL;int flength = 1024;void * start_addr = 0;if(argc < 3){printf("Usage: %s <file_in> <file_out>\n", argv[0]);return 1;}fd = open(argv[1], O_RDONLY, S_IRUSR | S_IWUSR);fd_out = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);if(fd == -1 || fd_out == -1){perror("open");return 1;}flength = lseek(fd, 0, SEEK_END); // 求得文件長度mapped_mem = mmap(start_addr, flength, PROT_READ, //允許讀MAP_PRIVATE, //不允許其它進程訪問此內存區域fd, 0);if(mapped_mem == MAP_FAILED){perror("mmap");return 1;}reverse(mapped_mem, flength, fd_out); // 逆順輸出文件內容到fd_outclose(fd);close(fd_out);munmap(mapped_mem, flength);return 0; }

總結

以上是生活随笔為你收集整理的文件逆顺输出到新文件(三种方案)的全部內容,希望文章能夠幫你解決所遇到的問題。

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