C语言中如何把一个文件读入内存?

本文介绍了一种方法,通过fread函数将整个文件内容一次性读入内存,然后使用指针逐字符处理。首先打开文件,计算文件长度,接着分配相应内存,最后读取文件内容并在末尾添加结束符。这样可以实现不使用fgetc逐字符读取文件的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:我只会用fgetc()一个一个字符的读取文件,现在老师要求我一次把整个文件读入内存,在内存中再一个一个字符的读取,请问该如何做?

解决方法:
 

#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;
}

在C语言中,我们可以编写一个简单的函数来从文件读取班级学生的学号。这里我们假设文件是以文本格式存储,每个学生一行,每行包含学号。下面是一个基本的函数示例: ```c #include <stdio.h> #include <stdlib.h> // 定义结构体表示学生信息 typedef struct { int student_id; // 学号 } Student; // 从文件读取并返回学号的函数 Student* read_students_from_file(char *filename, size_t *num_students) { FILE *file = fopen(filename, "r"); // 打开文件 if (file == NULL) { perror("Error opening file"); return NULL; } Student *students = malloc(*num_students * sizeof(Student)); // 动态分配内存 if (students == NULL) { perror("Memory allocation failed"); fclose(file); return NULL; } size_t i = 0; while (fgets(students[i].student_id, sizeof(int), file)) { // 逐行读取 students[i].student_id = atoi(students[i].student_id); // 转换为整数 ++i; } *num_students = i; // 更新学生总数 fclose(file); // 关闭文件 return students; } // 使用函数示例 int main() { char filename[] = "students.txt"; // 文件路径 size_t num_students = 0; Student *student_list = read_students_from_file(filename, &num_students); if (student_list != NULL) { printf("Read %zu students from the file:\n", num_students); for (size_t i = 0; i < num_students; ++i) { printf("Student %d: ", student_list[i].student_id); } free(student_list); // 释放内存 } else { printf("Failed to read students.\n"); } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值