关于动态内存和输入输出文件

最近和师兄的课题交流,特别是这两天重点集中到实践上。动态分配存储空间和输入输出文件无疑是非常重要的。

这里仍记录以下今天借阅的这本C++给出的一些例子:

动态内存的模拟

struct memo{
    int start;
    int finish;
    memo* next;
};

void arrange(memo* memo)
{
    memo* insPos = head, *curPos, *minPos;
    while(insPos->next != NULL){    //直接插入排序
        curPos = minPos = insPos;
        while(curPos->next = NULL){ //找起始地址最小的结点
            if(curPos->next->start<minPos->next->start)
                minPos = curPos;
            curPos = curPos -> next;
        }
        //插入最小节点
        curPos = minPos -> next;
        minPos -> next = curPos -> next;
        curPos -> next = insPos -> next;
        insPos -> next = curPos;
        intPos = insPos -> next;
    }
    //合并连续的内存块
   for(curPos = head -> next; curPos -> next !=NULL; curPos = curPos -> next){
    //当前块与下一块连续,执行合并
   while(curPos->finish + 1 == curPos->next->start){
        minPos=curPos->next;
        curPos->finish=minPos->finish;
        curPos->next=minPos->next;
        delete minPos;
        if(curPos->next==NULL)return;
    }
}

另外一个非常实用的程序:统计一个文件中单词使用的频率

 #include <iostream>
 #include <iomanip>
 #include <fstream>
 using namespace std;

 struct word{
     char data[20];
     int count;
 };

 void getWord(ifstream &fp, char ch[]);     //从文件中读入一单词
 void doubleSpace(word* &list, int &size); //扩大数组空间

 int main()
 {
     ifstream in("txt.txt");
     char ch[20];
     int size = 10, len = 0, i, j;
     word* result = new word[10];

     if(!in){cout <<"文件打开错误"<<endl;return 1;}
     while(true){                  //读文件直到结束
         getWord(in, ch);        //读入一个单词ch
         if(ch[0]==‘\0‘) break;
         for(i = 0; i < len; ++i)
             if(strcmp(result[i].data, ch) >= 0) break;
         if(i < len && strcmp(result[i].data, ch) == 0){
             result[i].count += 1;
             coutinue;
         }
         if(size == len) doubleSpace(result, size);
         for(j = len++; j > i; --j)    result[j] = result[j-1];
         strcpy(result[i].data, ch);
         result[i].count = 1;
     }
     for(i = 0; i < len; ++i)
        cout << stw(20) << elft << result[i].data << setw(5) << result[i].count << endl;
     in.close();
     cin >> ch[0];
     return 0;
}
时间: 2024-08-05 19:36:11

关于动态内存和输入输出文件的相关文章

C++学习笔记(五):高级编程:文件和流,异常处理,动态内存,命名空间

C++ 文件和流 到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流. 本教程介绍如何从文件读取流和向文件写入流. 这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: 要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>. 打开文件 在从文件读取信息或者向文件写入信息之前,必须先打开文件.ofstream 和

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

【C++】动态内存与智能指针

C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内存动态分配 其中,静态存储区以及栈内存中的对象,都是由编译器自动创建和销毁,而堆内存中的对象都是由程序显示控制的,通常都是new创建delete销毁或者malloc创建free销毁.动态内存的管理非常棘手,如果动态地创建了对象却没有显式得销毁,就会发生内存泄漏:如果在还有指针引用的时候释放了内存就会

clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现

1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) 1 int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一组信号. semid: 信号集的识别码,可通过semget获取. sops: 指向存储信号操作结构的数组指针,信号操作结构的原型如下 1 struct sembuf 2 { 3 unsigned short sem_num; /* semaphore number */ 4 short sem_op

如何在MD(d)和MT(d)工程间正确分配和释放动态内存

MD(d)和MT(d) MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项. /MT是"multithread, static version" 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号. /MD是"multithread- and DLL-specific version",意思是多线程DLL版本,定义了它后,编译器把MSVCRT.li

C++ primer 第十二章笔记之 动态内存

动态内存: 运算符:new,delete 智能指针: 头文件:memory shared_ptr:允许多个指针指向同一个对象; unique_ptr:"独占"所指向的对象; weak_ptr:一种弱引用,指向shared_ptr所管理的对象; shared_ptr类 智能指针也是模板,创建指针时,提供指针指向的类型; //创建: shared_ptr<string> p1; //若p1不为空,检测它是否指向一个空string if( p1 &&p1->

C复习---动态内存分配

原型extern void *malloc(unsigned int num_bytes);头文件#include <stdlib.h>#include <malloc.h>函数声明void *malloc(size_t size);备注:void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比 如是char还是int或者其他数据类型).所以在使用时一般要做一下强制类型转换.功能分配长度为nu

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分