如何实现在C++中的getline函数
0x00 问题
如何实现在C++中的getline函数
0x01 自行封装
今天下班前被小Lin童鞋叫住了,他要开发一个Python的项目,需要读取文件,我就想我们一块写,看谁写得快!
我信誓旦旦的选择了C语言 :( - Python的确不想碰了。
实现之前想了很多,根据自己对C++中读取文件时使用getline的理解,自己写了下面这些代码,但是有一个内存分配无法释放的问题,想留在明天解决
还要看刀剑神域呢 ~
0x02 源代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mm_malloc.h>
void error_handle(char * msg);
char * get_str_line(FILE * fp,char * lines);
int get_file_lines(FILE * fp);
int get_str_num(FILE * fp);
/**
* 获取文件所有行数
* @param fp
* @return
*/
int get_file_lines(FILE * fp){
int l = 0;
while(!feof(fp)){
if(fgetc(fp) == '\n'){
l ++ ;
}
}
fseek(fp,0,SEEK_SET);
return l;
}
/**
* 输出错误处理
* @param msg
*/
void error_handle(char * msg){
printf("Error Message : %s",msg);
exit(-1);
}
/**
* 获取当前行字符数
* @param fp
* @return
*/
int get_str_num(FILE * fp){
int c_line = 0; //
while(!feof(fp)){
if(fgetc(fp) == '\n'){
break;
}
c_line++;
}
return c_line;
}
/**
* 获取文件当前行字符串
* @param fp
* @return
*/
char * get_str_line(FILE * fp,char * lines){
long current_fp = ftell(fp); // 获得当前指针位置
int c_line = 0; //
fseek(fp,current_fp,SEEK_SET); // 将文件指针恢复
//char * lines = (char *)malloc(c_line * sizeof(char)); // 分配动态内存 、 这个变量如何free ?
char tmp[100];
tmp[0] = 'a';
c_line = 0; // 变量复用
char ch; // 临时变量 用于存储字符
while(!feof(fp)){ // 如果文件还未结束
ch = fgetc(fp); // 读取字符
if(ch==EOF){ // 如果文件到达尾部
break; // 退出循环
}
if(ch == '\n'){ // 如果遇到换行 退出循环
break;
}
lines[c_line] = ch; // 将取得的字符赋值给当前行变量
c_line ++;
}
return lines; // 返回一行字符
}
int main() {
// 打开文件
FILE * fp = fopen("100.txt","r");
// 将文件指针重置为起始位置
fseek(fp,0,SEEK_SET);
// 获取文件行数
int FILE_LINE = get_file_lines(fp);
// 分配一个一位数组 元素个数为 FILE_LINE + 1
char * dic_lines[FILE_LINE+1];
// 动态分配内存 用于存储每一行内容
for(int x = 0; x <= FILE_LINE;x++){
dic_lines[x] = (char *)malloc(sizeof(char)*100); // 分配一个一维数组,每个元素100个字节
}
//char lines[100];
// 将每行放入一维数组
for(int a = 0;a <= FILE_LINE;a++){
char * lines = (char *)malloc(sizeof(char)*100);
dic_lines[a] = get_str_line(fp,lines);
}
// 放入内存后,怎么操作都随你了 ~
// 释放内存
for(int x = 0; x <= FILE_LINE;x++){
printf("line : %d,string is %s \n",x,dic_lines[x]); // 萌萌哒的在释放之前输出 ~
free(dic_lines[x]);
}
// 关闭文件
fclose(fp);
return 0;
}
下面在总结一下C语言对文件的操作函数,明天写