C语言解析特定格式ASCII数字文件失败,求技术解决方案
解决你的C语言文件读取解析问题
嘿,我来帮你搞定这个文件读取失败的问题!咱先梳理下你的需求:要读取100组数据,每组是64个0-16的数字,跟着1个0-9的标签数字,然后把这些数据存到对应的二维数组里。你的代码现在有几个关键问题导致解析失败,我给你一一指出来,再给你一个完整的可运行版本。
原代码里的核心问题
- 文件打开函数用错了:你用了
open(),但这个是POSIX系统的系统调用,返回的是整数类型的文件描述符,不是C标准库的FILE*指针。应该用标准库的fopen()函数来打开文件,这样才能配合后续的标准IO函数读取内容。 - 缺少关键的读取函数实现:你只写了
Read_Data_tra的开头(还打错了名字,原代码里是Read_Data_t...),但没有实现这个函数的具体逻辑,这肯定没法完成数据解析。 - 输出数组的逻辑不明确:你定义了
s_output[EXAMPLES][OUTPUT](OUTPUT=10),结合标签是0-9的数字,应该是要做one-hot编码(比如标签为3时,数组第3位设为1,其余为0),但原代码里没有这个处理逻辑。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #define EXAMPLES 100 #define INPUT 64 #define OUTPUT 10 double s_input[EXAMPLES][INPUT] = {0}; double s_output[EXAMPLES][OUTPUT] = {0}; // 实现数据读取函数 void Read_Data_tra(FILE* f, double input[EXAMPLES][INPUT], double output[EXAMPLES][OUTPUT]) { for (int i = 0; i < EXAMPLES; i++) { // 读取每组的64个输入数字 int read_count = fscanf(f, "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf " "%lf %lf %lf %lf %lf %lf %lf %lf", &input[i][0], &input[i][1], &input[i][2], &input[i][3], &input[i][4], &input[i][5], &input[i][6], &input[i][7], &input[i][8], &input[i][9], &input[i][10], &input[i][11], &input[i][12], &input[i][13], &input[i][14], &input[i][15], &input[i][16], &input[i][17], &input[i][18], &input[i][19], &input[i][20], &input[i][21], &input[i][22], &input[i][23], &input[i][24], &input[i][25], &input[i][26], &input[i][27], &input[i][28], &input[i][29], &input[i][30], &input[i][31], &input[i][32], &input[i][33], &input[i][34], &input[i][35], &input[i][36], &input[i][37], &input[i][38], &input[i][39], &input[i][40], &input[i][41], &input[i][42], &input[i][43], &input[i][44], &input[i][45], &input[i][46], &input[i][47], &input[i][48], &input[i][49], &input[i][50], &input[i][51], &input[i][52], &input[i][53], &input[i][54], &input[i][55], &input[i][56], &input[i][57], &input[i][58], &input[i][59], &input[i][60], &input[i][61], &input[i][62], &input[i][63]); // 检查输入数字是否读取完整 if (read_count != INPUT) { fprintf(stderr, "第%d组输入数据读取失败,只读取了%d个数字\n", i+1, read_count); exit(EXIT_FAILURE); } // 读取标签数字 int label; if (fscanf(f, "%d", &label) != 1) { fprintf(stderr, "第%d组标签读取失败\n", i+1); exit(EXIT_FAILURE); } // 处理one-hot编码:对应标签位置设为1.0,其余为0.0 if (label >= 0 && label < OUTPUT) { output[i][label] = 1.0; } else { fprintf(stderr, "第%d组标签%d超出范围0-9\n", i+1, label); exit(EXIT_FAILURE); } // 跳过换行符(如果有的话,避免影响下一组读取) fscanf(f, "\n"); } } int main(int argc, char* argv[]) { // 用fopen打开文件,"r"表示只读模式 FILE* f = fopen("path/to/file", "r"); if (!f) { perror("打开文件失败"); return EXIT_FAILURE; } Read_Data_tra(f, s_input, s_output); // 可选:验证读取结果,比如打印第一组的前5个输入和标签 printf("第一组前5个输入数字:%.0lf %.0lf %.0lf %.0lf %.0lf\n", s_input[0][0], s_input[0][1], s_input[0][2], s_input[0][3], s_input[0][4]); printf("第一组标签的one-hot结果:"); for (int j = 0; j < OUTPUT; j++) { printf("%.0lf ", s_output[0][j]); } printf("\n"); fclose(f); // 记得关闭文件 return EXIT_SUCCESS; }
代码关键点说明
- 文件打开与关闭:用
fopen()打开文件,最后一定要用fclose()关闭,避免资源泄漏;如果打开失败,用perror()打印具体的错误信息(比如文件不存在、权限不够)。 - 数据读取逻辑:用
fscanf()批量读取64个输入数字,然后读取标签;加入了严格的错误检查,一旦读取数量不对或者标签非法,就打印错误信息并退出,方便你排查问题。 - One-hot编码处理:根据标签值把输出数组对应位置设为1.0,符合你定义
OUTPUT=10的需求;如果不需要one-hot,也可以把s_output改成一维数组直接存标签值,按需调整即可。 - 跳过换行符:每组数据末尾的换行符用
fscanf("\n")跳过,避免下一次读取时被当作空白字符干扰。
内容的提问来源于stack exchange,提问作者ShinobiUltra
相关产品推荐
相关产品推荐

