前面有生篇文章“给二级指针分配空间”,分配的空间有点问题,不连续,正确的分配方法如下面的例子。以下例子实现的功能是:把文件当中的每一行读到一个数组中的一个char*里面。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WORDSLEN_
#define WORDSLEN 32
#endif
#define PRINTERR(errMsg) printf("error:%s",errMsg)
#define FREEIF(ptr) {if (ptr) free(ptr);}
#define CLOSEIF(fptr) {if (fptr) fclose(fptr);}
int load2Var(char *filename, char arr[][WORDSLEN])
{
FILE *fin = NULL;
char *text = NULL; //the content of the file text
char *ptr;
int textLen = 0;
int i = 0;
char *delim = "\n ";
if (!(fin = fopen(filename,"r")))
{
PRINTERR("filename\n");
return -3;
}
fseek (fin,0L,SEEK_END);
textLen = ftell (fin);
fseek (fin,0L,SEEK_SET);
do
{
if (!(text = (char *)calloc(textLen+1,sizeof(char))))
{
PRINTERR("calloc\n");
break;
}
fread(text,textLen,1,fin);
ptr = (char *)strtok(text,delim);
while (ptr)
{
strcpy(arr[i], ptr);
ptr=(char *)strtok(NULL,delim);
i++;
}
}while(0);
FREEIF(text);
CLOSEIF(fin);
return i;
}
int main(int argc, char **argv)
{
int len = 0, i = 0;
char **myarr = NULL;
if (!(myarr = (char **)malloc(WORDSLEN*sizeof(char *))))
{
printf("malloc myarr err");
return -1;
}
*myarr = (char *)malloc(sizeof(char) * WORDSLEN * WORDSLEN);
if (myarr[0] == NULL)
{
return -2;
}
for (i = 0; i < WORDSLEN; i++)
{
myarr[i] = (char *)myarr[0] + WORDSLEN * i;
}
memset(myarr[0],0,WORDSLEN*WORDSLEN);
len = load2Var("input.txt", *myarr);
printf("Len=%d\n",len);
for (i = 0; i < WORDSLEN; i++)
{
if (strlen(myarr[i]) > 0)
printf("%s \n", myarr[i]);
}
FREEIF(*myarr);
FREEIF(myarr);
return 0;
}
分享到:
相关推荐
12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串...
第21章 ANSI/ISO C++标准语言补充 21.1 简介 21.2 bool数据类型 21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符...
第21章 ANSI/ISO C++标准语言补充 21.1 简介 21.2 bool数据类型 21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符...
二、功能要求: 1、本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 2、本系统显示这样的菜单: 请选择系统功能项: a、 成绩录入 b、 成绩显示 c、 成绩保存 d、 成绩排序 e、 成绩...
硬盘空间:10GB 安装 1. 安装程序成功下载,将会得到如下2个文件: 解压文件将得到database文件夹,文件组织如下: 点击setup.exe执行安装程序,开始安装。 2. 点击安装程序将会出现如下安装界面,步骤 1/9:...
21.2 补充几个类使用上的要点 21.3 使用成员函数重载二元运算符 21.4 使用friend函数重载二元运算符 21.5 重载一元运算符 21.6 含有指针数据成员的类 21.7 等效阻抗的计算 21.8 常犯的错误 21.9 本章重点 ...
5.2.2 给函数传递指针实参 218 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 224 5.2.5 使用const修饰符 226 5.2.6 main()函数的实参 227 5.2.7 接受数量不定的函数实参 229 5.3 从函数返回值 ...
RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457_FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验...
第二章 用 C 对 8051 编程 1 为什么要用高级语言 2 C 语言的一些要点 2.1 结构 2.2 联合 2.3 指针 2.4 类型定义 3 Keil C和ANSI C 3.1 数据类型 3.2 特殊功能寄存器 4 存储类型 4.1 DATA 区 4.2 BDATA区 4.3 IDATA段...
RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457 FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入...
RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457 FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入...
5.2.2 给函数传递指针实参 217 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 222 5.2.5 使用const修饰符 224 5.2.6 rvalue引用形参 225 5.2.7 main()函数的实参 227 5.2.8 接受数量不定的函数实参 229...
此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法...
此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法...
本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试...
本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快速学习编译、安装、调试的...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...