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 1024
FILE * 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__