`
jakielong
  • 浏览: 229162 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

定长队列写入文件并读取

阅读更多

#include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
 
#define SIZE 5;
 #define LEN sizeof(struct node)
 
typedef struct node {
 char name[20];
 struct node *next;
 } nodes;
 
nodes *createNewNodes(void) {
 printf("创建新链表\n");
 nodes *p;
 if ((p = (nodes *) malloc(sizeof(nodes))) == NULL) {
 printf("out of mem!");
 exit(1);
 }
 
p->name[0] = '\0';
 p->next = NULL;
 return (p);
 }
 
nodes *getLastNode(nodes *p) {
 nodes *s;
 s = p->next;
 while (s != NULL) {
 s = s->next;
 }
 return (s);
 }
 
int getNodesNum(nodes *p) {
 int i = 0;
 p = p->next;
 while (p) {
 i++;
 p = p->next;
 }
 return i;
 }
 


void printAll(nodes *p, nodes *lastSecond, int n) {
 nodes *t;
 if (p->next == NULL) {
 printf("当前链表没有节点\n");
 } else {
 t = p->next;
 printf("=====链表地址情况:共%d个节点=====\n", n);
 while (t != NULL) {
 printf("数据:%s ", t->name);
 printf("地址:%p\n", t);
 t = t->next;
 }
 printf("倒数第二个元素为:%s\n", lastSecond->name);
 printf("============================\n");
 }
 }
 
nodes *testInit() {
 nodes *tmp, *p;
 p = createNewNodes();
 int i;
 char *test[5] = { "abc", "def", "ghi", "jkl", "mnt" };
 for (i = 0; i < 5; i++) {
 if ((tmp = (nodes *) malloc(sizeof(nodes))) == NULL) {
 printf("out of mem!");
 exit(1);
 }
 strncpy(tmp->name, test[i], 20);
 tmp->next = p->next;
 p->next = tmp;
 }
 return (p);
 }
 
void WriteNodesToFile(char *filename, nodes *p) {
 printf("把链表写入文件\n");
 FILE *fp;
 if ((fp = fopen(filename, "wb")) == NULL) //打开文件名为:file_name的文件
 {
 printf("can not open the file!\n");
 }
 p = p->next;
 while (p != NULL) {
 fwrite(p, LEN, 1, fp);
 p = p->next;
 }
 fclose(fp);
 }
 
int headAppend(nodes *p, char *name, nodes **lastSecond,int *nums)
 {
 printf("写入节点: %s\n", name);
 s = p;
 if ((new = (nodes *) malloc(sizeof(nodes))) == NULL) {
 printf("out of mem!");
 exit(1);
 }
 strncpy(new->name, name, 20);
 
new->next = s->next;
 s->next = new;
 
if (*nums < 5){
 *nums +=1;
 }else{
 (*lastSecond)->next = NULL;
 }
 return 1;
 }
 
void loadNodeFromFile(char *filename, nodes *head, nodes **lastSecond,int *nums) //尾插法
 {
 printf("从文件读入链表\n");
 FILE *fp;
 nodes *p, *t;
 int i = 0;
 if ((fp = fopen(filename, "rb")) == NULL) //打开文件名为:file_name的文件
 {
 return;//文件不存在!
 }
 
t = head;
 while (!feof(fp)) {
 if ((p = (nodes *) malloc(sizeof(nodes))) == NULL) {
 printf("out of mem!");
 }
 if (!fread(p, LEN, 1, fp)) {
 break;
 }
 i++;
 *nums = i;
 *lastSecond = t;
 p->next = t->next;
 t->next = p;
 t = p;
 
}
 fclose(fp);
 }
 
int main(int argc, char **argv) {
 char *filename = "file_name.txt";
 
/*第二次的时候可以尝试从这里开始注释*/
 /*
 nodes *p;
 printf("初始化链表: \n");
 p=testInit();//初始化,这里是测试的,应该是从file文件读取结构存放到指针p
 printAll(p);
 
headAppend(p,"opq");//加入一个节点
 printAll(p);
 

headAppend(p,"rst");//加入一个节点
 printAll(p);
 

//WriteNodesToFile(filename,p);
 free(p);*/
 /*一直到这里*/
 
nodes *t = createNewNodes()/*建立一个链表并初始化*/;
 nodes *lastSecond;/*指向链表的倒数第二个元素*/
 int nodeNum;/*链表个数*/
 loadNodeFromFile(filename, t, &lastSecond, &nodeNum);
 printAll(t, lastSecond, nodeNum);
 
//printf("%d",last->next==null);
 headAppend(t, "uvw",&lastSecond, &nodeNum);//加入一个节点
 printAll(t, lastSecond, nodeNum);
 
headAppend(t, "zxy",&lastSecond, &nodeNum);//加入一个节点
 printAll(t, lastSecond, nodeNum);
 /*
 
headAppend(t,"uvw");//加入一个节点
 printAll(t);
 
WriteNodesToFile(filename,t);*/
 free(t);
 return 0;
 }
 
分享到:
评论

相关推荐

    xxjyjy5.rar_LINUX消息队列_linux 消息队列_linux 消息_linux 消息队列_消息队列

    消息队列是一种存储消息的特殊数据结构,它允许多个进程同时读取和写入。与管道和信号量不同,消息队列可以保存一定数量的消息,并且支持消息的有序发送和接收。消息队列在系统中由内核管理,具有持久性,即使创建它...

    完全公平队列的实现

    CFQ还能区分不同类型的I/O操作,如读取和写入。对于读操作,通常会比写操作给予更高的优先级,因为读操作通常更快并且对用户体验影响更大。 **时间片轮转**: CFQ使用时间片轮转机制来分配磁盘访问时间。每个进程会...

    使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据

    标题"使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据"揭示了这个项目的核心内容:通过Netty接收TCP长连接的数据,并将这些数据存储到Kafka中,同时利用Kafka的批量消费功能对数据进行处理。下面我们将...

    Android文件下载(实现断点续传)

    此外,为了优化用户体验,可以采用线程同步机制,避免多个线程同时写入文件导致的数据混乱,以及使用队列管理下载任务,防止过多并发请求给服务器带来压力。 综上所述,实现Android文件的断点续传下载主要依赖于...

    C++实现的TCP协议的文件传输

    5. **文件读写**:文件的读取通常用到`fread()`或`ifstream`,写入文件则可以使用`fwrite()`或`ofstream`。在TCP传输中,我们需要将文件内容拆分成多个数据块,逐个发送。 6. **数据发送与接收**:使用`send()`或`...

    Kestrel持久化队列服务器

    Kestrel是一款高性能、轻量级的消息队列系统,最初由Twitter开发并开源。它主要被设计用来处理实时流数据,提供了一个简单的基于HTTP的API来发送和接收消息。Kestrel的一个关键特性是其持久化能力,这使得即使在...

    Linux下文件传输实现全过程c语言

    本文将详细介绍如何利用C语言在Linux系统上实现文件的传输,并解释代码中的关键函数与实现细节。 #### 代码结构分析 首先,让我们对提供的服务器端代码进行解析。这个程序主要实现了以下功能: 1. **文件传输**:...

    Linux系统编程哈工大中文版

    文件操作包括打开、读取、写入和关闭文件。 ##### 2.1.1 打开文件 `open()`函数用于打开或创建一个文件,并返回一个文件描述符。 ##### 2.1.2 创建新文件 当文件不存在时,`open()`可以用特定的权限创建新文件。 ...

    Hbase运维手册.pdf

    通过调整BlockCache大小来提高命中率,Memstore用于写入,BlockCache用于读取。当Memstore满64MB时触发flush,当其总大小超过堆内存的特定比例时,会强制flush。 3. **读写请求数**: - 监控各RegionServer的读写...

    [分享]两种强力读写内存的方法(可过某游戏代理商的保护).pdf

    - `RWPM_INFO` 结构体包含了需要读写的目标地址 (`Address`)、缓冲区指针 (`Buffer`)、读写长度 (`Length`)、操作类型 (`Type`,其中 0 表示读取,1 表示写入) 和一个事件对象 (`Event`) 用于同步操作。 2. **编写...

    百万量级php excel快速导出代码案例

    在每写入一定行数后,将缓冲区内容写入文件并清空缓冲区,这样可以减少磁盘I/O次数: ```php $count = 0; ob_start(); foreach ($rows as $row) { fputcsv($fp, $row); $count++; if ($count % 10000 === 0) { ...

    IBM MQ实验3_MQ通讯配置

    - `amqsput`:向队列写入消息。 - `amqsbcg`和`amqsget`:从队列读取和查看消息内容。 - `DISPLAY QL(QUEUE_NAME) CURDEPTH`:显示队列的当前深度,即队列中消息的数量。 7. **故障排查**: - 检查本地传输队列...

    Linux系统编程

    - 文件操作是系统编程的核心之一,涉及文件的创建、读写、权限管理等。 - 文件系统负责管理磁盘上的数据组织结构,如ext4、XFS等。 - **进程:** 操作系统资源分配的基本单位,每个进程都有独立的地址空间。 - **...

    用时间片轮转法调度虚拟进程

    4. **输入与输出**:进程的个数和它们的属性(如运行时间、优先级)应该从一个输入文件读取,而调度的结果应写入到一个日志文件中。这需要处理文件输入/输出(I/O)操作,例如使用`ifstream`和`ofstream`进行文件读写...

    Study of an operating system FreeRTOS

    队列管理包括创建队列、向队列写入数据和从队列读取数据。创建队列时可以指定队列长度和数据项大小。使用队列可以有效防止多个任务访问同一资源时发生冲突。 资源管理部分涉及到了二元信号量、互斥锁和计数信号量。...

    计算机操作系统实验-进程通信(一).doc

    在实验中,我们编写了一个使用共享存储区机制的程序,使得父进程可以创建一个长度为 512 字节的共享内存空间,并将其写入共享内存中。子进程可以将共享内存也附加到自己的地址空间,并向共享内存中写入数据。 三、...

    MQ整体流程图

    这些线程会根据队列的优先级和请求类型(如读取或写入)来排序和执行任务。例如,读取操作通常优先于写入操作,因为它们对用户界面的响应时间影响更大。 在执行过程中,MQ还会考虑设备的特性,如队列深度限制、设备...

Global site tag (gtag.js) - Google Analytics