C实现文件内部操作

来源:互联网 发布:最全在线网络理财投资 编辑:程序博客网 时间:2024/06/05 17:05

main.c

#include "file_op.h"void show_menu(){    printf("F : 显示前一行\n");    printf("B : 显示后一行\n");    printf("S : 保存\n");    printf("Q : 退出程序\n");}void init(char *file_name){    char cmd[20] = {'\0'};    FILE *fd = open_file(file_name);    init_list(fd);    fclose(fd);    while (1)    {        show_menu();        printf("请输入你的选择: ");        fgets(cmd, sizeof(cmd), stdin);        if (strlen(cmd) != 2)        {             printf("您的输入有误\n");            continue;        }        if (cmd[0] == 'Q')            break;        switch (cmd[0])        {        case 'F':            show_pre_content();            break;        case 'B':            show_next_content();            break;        case 'S':        {            char file_name[100] = { '0' };            printf("请输入要保存的文件名: ");            scanf("%s", file_name);            save_contents(file_name);        }            break;        default:            break;        }    }    delete_list();}int main(int argc, char *argv[]){    assert(argc == 2);    init(argv[1]);    return 0;}

file_op.c

#include "file_op.h"#include <string.h>#include <stdlib.h>file_data *head = NULL;file_data *current = NULL;#define BUFFSIZE 1024FILE * open_file(char *file_name){    FILE *fd = fopen(file_name, "r");    assert(fd != NULL);    return fd;}void init_list(FILE * fd){    file_data *printData;    char buf[BUFFSIZE] = {'\0'};    int len = 0;    while (!feof(fd))    {        memset(buf, sizeof(buf), 0);        if (fgets(buf, sizeof(buf), fd))        {            file_data *data;            assert(buf != NULL);            data = (file_data *)malloc(sizeof(file_data));            assert(data != NULL);            insert_node(data, buf);        }       }    printData = head;    while (1)    {        printf("%s\n", printData->content);        printData = printData->next;        if (printData == head)            break;    }}void insert_node(file_data *data, char *buf){    int len = strlen(buf);  //这里+1,是为了忽略了末尾的\n    data->content = (char *)malloc(len);    memset(data->content, sizeof(data->content), 0);    memcpy(data->content, buf, len);    if (data->content[len - 1] == '\n')        data->content[len - 1] = '\0';    if (head == NULL)    {        head = data;        head->pre = head;        head->next = head;        current = head;    }    else    {        data->next = head;        data->pre = head->pre;        head->pre->next = data;        head->pre = data;    }}void delete_list(){    file_data *last_data = head->pre;    file_data *node = head;    file_data *tmp;    while (1)    {        if (node == last_data)        {            free(last_data);            last_data = NULL;            break;        }        tmp = node;        node = node->next;        tmp->pre->next = node;        node->pre = tmp->pre;        free(tmp);        tmp = NULL;    }}void show_pre_content(){    if (current != head)    {        current = current->pre;        printf("%s\n", current->content);    }    else    {        printf("已经是第一行数据\n");    }}void show_next_content(){    if (current->next != head)    {         current = current->next;        printf("%s\n", current->content);    }    else    {        printf("已经是最后一行数据\n");    }}void save_contents(char *save_fila_name){    FILE *fd;    file_data * data;    int len = 0;    int flag = 0;   //是否保存完的标志    assert(save_fila_name != NULL);    fd = fopen(save_fila_name, "w");    data = head->pre;    while (1)    {        char *content;        if (data == head)            flag = 1;   //        len = strlen(data->content);        content = (char *)malloc(len * sizeof(char) + 1);        desc_content(content, data->content, len);        printf("%s\n", content);        fprintf(fd, "%s\n", content);        free(content);        content = NULL;        data = data->pre;        if (flag == 1)  //保存完退出保存            break;    }    fclose(fd);    printf("文件保存成功\n");}char * desc_content(char *dest, char *src, int len){    int i = 0;    assert(src != NULL && dest != NULL);    while (i < len)    {        dest[i] = src[len - i - 1];        i++;    }    dest[i] = '\0';    return dest;}

file_op.h

#ifndef __FILE_OP_H__#define __FILE_OP_H__#define _CRT_SECURE_NO_WARNINGS#include <assert.h>#include <stdio.h>typedef struct file_data_struct file_data;struct file_data_struct{    char *content;      //存储每一行内容    file_data * pre;    file_data * next;};//加载文件到链表系列函数FILE * open_file(char *file_name);void init_list(FILE * fd);void insert_node(file_data *data, char *buf);//释放链表内存void delete_list();//显示上一行下一行系列函数void show_pre_content();void show_next_content();//保存文件系列函数void save_contents(char *save_fila_name);char * desc_content(char *dest, char *src, int len);#endif // __FILE_OP__
0 0
原创粉丝点击