概述
下载了visual studio 2019,想要从下面的txt文本里读取数据到数组中,本来以为是比较简单的,但是发现自己对c语言的使用还是不太熟练导致了许多问题,所以还是小记一下。首先要说的是这个程序开始总是报debug assertion failed的错误,但是我出去玩了两天回来竟然不报错了。下次碰到这个问题先将软件关闭再打开或者开机重启试试。
首先还是把程序贴上来,因为是想把这一功能封装成函数,所以写成了函数形式,然后从主函数中调用
#include "mySVM.h"
void getTxtData(char* pFileName) {
errno_t err;
FILE* pFile;
err = fopen_s(&pFile, pFileName, "r");//读取名为pFileName的文本文件
if (err != 0)//判断文件是否打开是否成功
printf("文件打开失败\n");
else
printf("文件打开成功\n");
double data[10][3];//先只考虑文件中的数据为10行3列的小数
for (int i = 0;i < 9;i++)//读取10个浮点型数据
fscanf_s(pFile, "%lf %lf %lf", &data[i][0], &data[i][1], &data[i][2] );//fscanf_s函数固定格式读取文本中的数据;
for (int i = 0;i < 9;i++) {//将读取的数据输出
for (int j = 0;j < 3;j++)
printf("%f ", data[i][j]);
printf("\n");
}
fclose(pFile);
}
```c
#include "mySVM.h"
void main() {
getTxtData("D:\\123.txt");
}
运行结果如下:
fopen()与fopen_s()
在使用fopen()打开文件时,会报错说这个函数不安全,建议用fopen_s(),这是因为fopen()确实不太安全,网上说是确实溢出检查,所以vs2019会建议你用fopens(),如果是其他的软件或者老版的vs可能就不会报这个错误,也就是它们允许这种不安全的行为发生。下面是两个函数的用法和区别:
fopen()用法:fp = fopen(filename,“w”)
fopen_s()用法:需要定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,“w”)
fopen()打开文件成功,返回文件指针(赋值给fp),打开失败则返回NULL值;
fopen_s()打开文件成功返回0,失败返回非0,文件指针也是赋值给fp
其中的类型errno_t是通过 typedef int errno_t 定义的,所以本质上errno_t是int类型。文件打开后也要记得用fclose()关闭。
另外fscan()和fscanf_s()的情况也是类似,这里不详细叙述了。需要注意的是从网上找到这样的一句话:
根据c标准,输入时float用%f,double用%lf,输出时float和double都用%f
如果double输入也用%f会有警告,且读入的数据会出现一些问题