雨落鸢城 2019-01-05 21:43 采纳率: 0%
浏览 485
已采纳

C语言对用堆导入并显示的数据进行进一步的处理

原题目:求转录RNA组的平均值与标准差(英文翻译过来的)

附加条件:给了一个200多M的文件(数据,可以以txt,csv等形式打开 )

拿到题目以后解读数据就费了好长时间,数据中的名称全是英文,看了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc可是完全不知道引入文件后怎么将其导入数组内,试着将网上的程序拼接结果不行。////这时得到了堆空间这个名词,紧接着直接搜出了导入csv文件的相关代码(这里解释一下,这是大学老师布置的一道题,老师只教了我们谭浩强的红皮书就出这样的题目。。。老师也跟我们说了考验我们获取信息的能力。。。只是交作业不算抄袭吧?),就直接粘上了,然后逐行的读懂了这个程序,能够很顺利的用运行显示出所有数据,但是我想进一步做的时候发现自己需要将没一行数据单独进行运算,而这个程序是检测后直接一个个的将一整行显示了,所以我不知道该怎么进行下一步的数据处理。(其实这个程序的核心部分我也只是知道单独行的意思,整体的功能实现并不是太确定)求哪位好心人帮忙给讲一下怎么对导入的数据进行处理。自己的水平实在是不够了。
谢谢了。
#include
#include
#include
int getFilelen(FILE * file)//2.2.0----getfile...函数---- 主要是做逐行读取功能并记录行数
{
int len = 0;//2.2.1---定义了一个len=0其意义暂时不知----
if (file == NULL)
{
return -1;//2.2.2如果文件为空(或不存在??????????)直接结束
}
char buf[1024];//2.2.3定义一个大小为1024的一维数组(1024有无特殊含义???????)
//读取每一行
while (fgets(buf, 1024, file) != NULL)//2.2.4---- 将fp中的内容按1024字节大小读入text中,然后输出。直到读到fp的末尾,为空了。停止读取,然后关闭文件。 -----解释了1024的问题
{
len++;
//printf("%d ",len);
}
//设置光标
fseek(file, 0, SEEK_SET);//2.2.5---函数。。。跳到 ---错了。。。 意思是把文件指针指向文件的开头
return len;//2.2.6----返回len----此时回到77行继续运行程序

}

void readFileData(FILE * file, int len, char ** pArray) //2.3.1文件指针 长度 堆区数组----read为函数名的函数,其意义因该为读取吧 ---读取到数组???
{
if (file == NULL || len <= 0 || pArray == NULL)//2.3.2--如果存在什么不合理的情况,直接结束
{
return;
}
char buf[1024];
//读取每一行
int index = 0;
while (fgets(buf, 1024, file) != NULL)//同14行
{
int currentlen = strlen(buf) + 1;//strlen() 这个函数是返回一个字符串中的字符个数,不包括结束符 '\0';
char * currenP = (char *)malloc(sizeof(char) * currentlen);
strcpy(currenP, buf);//复制BUF ,buf包含整个数据库??

    pArray[index++] = currenP;//将buf放进数组??? 
    //  printf("%d ",pArray[index++] );
    memset(buf, 0, 1024);// 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值----转换为ascii之后方便计算?---- 
}//回79行 

}
void showFileData(char ** pArray, int len)//以show为开头的函数,其意义因该为展示,显示吧-----
{
for (int i = 0; i < len; i++)
{
int qwe=i;
printf("第%d行内容:%s\n", i+1, pArray[i]);//证实parray实际上包含了数据库
// printf("第%d行数据:%s\n",i+1,pArray[qwe+1]);
}
}//回80行
void freeSpace(char ** pArray, int len)//不用想了,释放空间,翻译一下就出来了
{
if (pArray == NULL || len == NULL)
{
return;
}
for (int i = 0; i < len; i++)
{
if (pArray[i] != NULL)
{
free(pArray[i]);
pArray[i] = NULL;
}
}
}//回81行
int test01()//2.1.0----test01函数,整个程序的主体部分(之后的\n和system只是辅助,显示的好看一些,没有什么意义) -----此函数意义仍为一个目录,具体操作在其他函数中
{
FILE * file = fopen("transcript_rna_tissue.csv", "r");//2.1.1打开文件,如果不存在或者打不开的话输出72内容,结束程序。
if (file == NULL)
{
printf("打开文件失败!\n");
return 0;
}
int len= getFilelen(file);//2.1.2----定义(调用)函数get...-----程序跳转至第5行

char ** pArray = (char **)malloc(sizeof(char *) * len);//2.2.0---定义一个符合文件大小要求的堆空间????? 
readFileData(file, len, pArray);//2.3.0---函数,跳到25行 -----------去掉这一行数据显示为 第i行数据:(null) 
showFileData(pArray, len);//到45行 ----------去掉程序不再运行 
freeSpace(pArray, len);//到52行 -----可以去掉,不影响显示 
pArray = NULL;//将PARRAY定回空----回87行 

}

int main()//1.0.0--定义主函数,程序的真正开端
{
test01();//2.0.0--调用函数 test01-----程序跳转到第67行
putchar('\n');
system("pause");
}//结束

  • 写回答

1条回答

  • shifenglv 2019-01-05 22:45
    关注

    csv文件和txt文件是一样的,你用文本编辑器打开,然后观察数据的存放规律,自己写个代码读取就可以了。计算平均值和方差,没必要使用动态分配内存,只要把方差公式展开,直接用循环来计算,根本不需要用到大数组,甚至连数组都是没有必要的。
    求平均值:
    M=(x1+x2+...xn)/n。
    求方差:
    S^2=((x1-M)^2+(x2-M)^2+...(xn-M)^2)/n
    =((x1^2+M^2-2*x1*M)+(x2^2+M^2-2*x2*M)+....(xn^2+M^2-2*xn*M))/n
    =(x1^2+x2^2+...xn^2)+(n*M^2)-2*M(x1+x2+......xn))/n
    在一个循环中,同时计算E(x)=(x1+x2+...xn)。
    E(x^2)=(x1^2+x2^2+...xn^)
    那么M=E(x)/n;S^2=(E(x^2)+n*M^2-2*M*E(x))/n。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab实现基于主成分变换的图像融合。
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊