如何将控制台打印值保存至文件?附异常代码求助
问题分析与解决办法
你的问题核心在于每次按键触发时频繁打开/关闭文件,这种操作会引发IO阻塞,干扰数据流的连续读取,进而导致控制台和文件中的数据出现异常。另外代码里还有几个潜在问题需要修正:
关键问题点
- 每次按键都执行
fopen/fclose,IO操作的延迟会打断数据流读取节奏,引发数据异常 - 未检查
fopen的返回值,若文件打开失败会触发未定义行为 - 控制台
printf无换行或手动刷新逻辑,数据可能积压在缓存中显示异常 - 代码中
D1和D2使用同一个arrayin转换,若arrayin在两行代码间未更新,会导致两者值完全一致(这可能是业务逻辑错误)
修正方案
- 提前打开文件:在主循环外一次性打开文件,退出程序时再关闭,避免重复IO操作
- 添加错误校验:确保文件打开成功后再执行写入操作
- 强制刷新缓存:控制台输出后手动刷新缓存,文件写入后也刷新保证数据立即落盘
- 修正D1/D2赋值逻辑:若业务需要两者不同值,需使用各自对应的数据源
修正后的代码示例
// 在主循环外提前打开文件 FILE* file_ready = fopen("Output_data.csv", "ab+"); if (!file_ready) { perror("Failed to open file"); // 处理文件打开失败的情况,比如直接退出 return 1; } // 假设这是你的主循环部分 while (1) { // 此处补充读取微控制器数据流到arrayin的逻辑,确保每次循环更新arrayin // ... // 若D1和D2需要不同值,需传入不同的输入数组,比如arrayin1和arrayin2 D1 = strtol(arrayin, 0, 2); // D2 = strtol(another_arrayin, 0, 2); // 替换为正确的数据源 struct pollfd mypoll; mypoll.fd = 0; mypoll.events = POLLIN; if (poll(&mypoll, 1, 0) == 1) { int press_button = getchar(); if (press_button == 'a') { // 用字符常量更易读,'a'的ASCII码就是97 printf("%x\t, %x\n", D1, D2); // 添加换行或手动刷新 fflush(stdout); // 强制刷新控制台缓存,确保数据及时显示 char array1[100]; sprintf(array1, "0x%x\t, 0x%x\n", D1, D2); fputs(array1, file_ready); fflush(file_ready); // 强制刷新文件缓存,避免数据丢失 } } } // 程序退出前关闭文件 fclose(file_ready);
额外建议
- 若数据流频率较高,建议积累N条数据后批量写入文件,进一步降低IO开销
- 可考虑用多线程分离数据采集和文件写入逻辑,避免文件操作阻塞数据流读取
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

