C语言 读取文件到内存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 读取文件到内存相关的知识,希望对你有一定的参考价值。
关于读取文件到内存,我有几个地方不太明白,希望大家能帮我一下。
文件的大小是指文件的行数么?如果是的话,怎么得到文件的行数?如果不是的话,那文件大小是指什么?
在不知道文件大小的时候,一般来说都是先得到文件大小,然后分配内存,能不能边读取边放到内存,就是说,在文件中读取一行,就把这一行放到内存中去,这样就不用先得到文件大小了
文件中有数字三列,第一列和第二列都是double类型的数字,第三列是单词,那我读取到内存中之后,是建三个数组好呢,还是建一个struct好呢,我比较倾向于数组→_→因为struct不太会用。。。麻烦说下数组和struct怎么建立
1.文件的大小。
文件大小:该文件所占的存储空间的大小,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB。
2.是否可以不预先分配内存。
可以不预先分配跟文件大小一致的内存,但是从文件中读出的每一行都要分配一个内存,可以为每一行设定一个固定的内存大小,比如A字节,然后用C语言的malloc函数为该行数据分配内存,读出数据后,判断分配的内存是否够用,如果不够用,可以用C语言的realloc函数对该块内存进行再分配。
malloc函数
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
void* 类型表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。
realloc函数
realloc的全程是reset allocation,中文名叫动态内存调整,用于调整一块连续的已分配的内存块区域。
3.数组和struct结构体的建立。
double数组:double a[100];
字符数组:char a[100];
struct结构体:
struct st
double a[100];
char b[100];
;
/**
* 用C语言实现将文件读入内存中
**/
#include <stdio.h>
#include <stdlib.h>
int filelength(FILE *fp);
char *readfile(char *path);
int main(void)
FILE *fp;
char *string;
string=readfile("c:/c.c");
printf("读入完毕\n按任意键释放内存资源\n");
//printf("%s\n",string);
system("pause");
return 0;
char *readfile(char *path)
FILE *fp;
int length;
char *ch;
if((fp=fopen(path,"r"))==NULL)
printf("open file %s error.\n",path);
exit(0);
length=filelength(fp);
ch=(char *)malloc(length);
fread(ch,length,1,fp);
*(ch+length-1)='\0';
return ch;
int filelength(FILE *fp)
int num;
fseek(fp,0,SEEK_END);
num=ftell(fp);
fseek(fp,0,SEEK_SET);
return num;
参考技术B 任何文件都可以读取,最多就是打开和读取方式不一样。\r\n普通的文本文件就直接按照默认方式打开。\r\n如果是其他基于流的文件就按照二进制方式打开。\r\n读取到内存中之后随便你怎么处理读取出来的数据~追问
谢谢回复,但是我不太明白你在说什么。。。能详细一点么,希望能给代码
本回答被提问者采纳在C语言中如果已经知道了一个数据的内存地址,怎样直接从内存中读取出该数据?
我刚学C语言,用的是DEV-C++软件。最近刚学到指针。我定义了一个指针变量,然后通过取地址符&取得了我已经定义的一个int数据的内存地址。但是我不想通过指针变量来直接输出该int数据的值,而是想直接读取内存的数据,看看和我定义的int数据值是否相同。
例程:
#include<stdio.h>
int main()
int a=123,b=1234567;
int *m,*n;
m=&a;
n=&b;
//printf("*m=%d\t,*n=%d\n",*m,*n); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",m,n);
return 0;
通过这个程序,我知道了m , n的值。它们是int a,b的内存地址,但是不知道怎样直接读取这2个地址的内存数据,看看是否和我定义的值相同。
你说的“我不想通过指针变量来直接输出该int数据的值,而是想直接读取内存的数据,看看和我定义的int数据值是否相同。”是没意义的,就好像你要确定我这个人是不是我这个人一样,如果你一定要写的话,可以写成这样。
#include<stdio.h>
int main()
int a=123,b=1234567;
int adda=&a,addb=&b;
int *m,*n;
m=adda;
n=addb;
//printf("*m=%d\t,*n=%d\n",*m,*n); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",a,b);
return 0;
这里的m和n已经和a,b没有任何逻辑联系了,他们只是表示两个内存段的数据而已。
再明确点可以写成
#include<stdio.h>
int main()
int a=123,b=1234567;
int adda=&a,addb=&b;//adda和addb仅仅表示两个内存地址
int contenta,contentb;
contenta=*adda;
contentb=*addb;//这两句的含义是两个内存地址里面的内容,他们和变量a,b没有逻辑关系
//printf("*m=%d\t,*n=%d\n",contenta,contentb); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",a,b);
return 0;
这里就是你说的比较a以及a所在的内存块(adda)里面内容是不是和a相等 参考技术A #include <stdio.h>
#include <string.h>
void main()
int *p;
int i=10;
p=(int*)0x0012ff78;//i的地址
printf("%d\n",*p);
输出的结果为10,你先调试下,可以知道i的地址
*P等价于*(int*)0x0012ff78本回答被提问者采纳 参考技术B #include<stdio.h>
int main()
int a=123,b=1234567;
int *m,*n;
m=&a;
n=&b;
printf("*m=%d\t,*n=%d\n",*m,*n);//打印指针指向的值
printf("m=%d\t,n=%d\n",m,n);//打印指针内存地址对应的十进制数,因为过大,会显示为一个 负数
printf("m=%p\t,n=%p\n",m,n);//打印指针类型的数据,即指针本身的地址
getch();
return 0;
输出的结果是:
*m=123 ,*n=-10617
m=-54 ,n=-52
m=FFCA ,n=FFCC
可以看到,b的值已经不是1234567,因为定义的b是个2个字节的,最大是65536,再大的数就会溢出,然后显示为负数的,同理,FFCA,FFCC也是过大,所以,m,n对应的十进制也是负数。追问
我这里没有出错:
*m=123 , *n=1234567
m=2293620 ,n=2293616
int 好像占4个字节
对了,不同的平台可能int的字节大小也不一定的,与平台有关,平时开发,用的是size_t类型的。
参考技术C 调试,vc6 有调试功能,就是加一个断点,再点击调试图标,不是感叹号,调到你想看的那句后,工作空间下边有两个窗口,右边的那个有左右两排网格,在左边输入你的变量或地址,右边会自动显示对应的值,大致就是这样,如果有错的话,你自己试试 参考技术D *和&是一对相反意义的运算符,一个取值(仅连地址量),一个取地址(仅连变量)。以上是关于C语言 读取文件到内存的主要内容,如果未能解决你的问题,请参考以下文章
在C语言中如果已经知道了一个数据的内存地址,怎样直接从内存中读取出该数据?
C 语言文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )