C++程序输出文件写入异常:仅输出表头无统计内容求助
问题分析与修复
核心问题
你的代码在控制台输出正常但写入文件仅能输出表头,主要是头文件缺失导致格式控制符失效,加上prev初始化不规范的潜在问题。
具体修复点
补充必要头文件
代码中使用了文件流、格式控制符,必须包含以下头文件,否则会导致setw、left等操作在文件流中无法正常工作,抑制后续内容输出:#include <iostream> #include <fstream> #include <iomanip> using namespace std;修正prev的初始化方式
用NULL初始化int类型变量是不规范的(NULL是指针常量),改为初始化一个数组中不存在的特殊值,避免逻辑异常:int prev = arr[0] - 1; // 取第一个元素减1,确保不等于任何数组元素确保输出流正常刷新
在关闭文件前显式调用flush(),强制将缓冲区内容写入文件,避免因缓冲区机制导致内容丢失:printData(arr, count, output); output.flush(); // 显式刷新缓冲区 output.close();
修复后的完整代码
#include <iostream> #include <fstream> #include <iomanip> using namespace std; void swap(int& a, int& b) { int temp = a; a = b; b = temp; } void selectionSort(int arr[], int size) { for (int i = 0; i < size; i += 1) { int min_num = arr[i]; int min_indx = i; for (int j = i; j < size; j += 1) { if (arr[j] < min_num) { min_num = arr[j]; min_indx = j; } } swap(arr[i], arr[min_indx]); } } void printData(int arr[], int size, ofstream& output) { output << setw(6) << left << "N" << "Count" << endl; int prev = arr[0] - 1; for (int i = 0; i < size; i++) { int count = 0; if (arr[i] == prev) continue; for (int j = 0; j < size; j++) { if (arr[i] == arr[j]) count += 1; } output << setw(6) << left << arr[i] << count << endl; prev = arr[i]; } } int main() { ifstream input; input.open("TextFile2.txt"); if (input.fail()) { cout << "file could not be opened." << endl; return 0; } int arr[50]; int num; int count = 0; while (input >> num) { arr[count] = num; count += 1; } selectionSort(arr, count); input.close(); ofstream output; output.open("output.txt"); printData(arr, count, output); output.flush(); output.close(); return 0; }
额外优化建议
因为数组已经排序,统计次数时可以不用嵌套循环,直接遍历一次统计连续相同元素的数量,大幅提升效率:
void printData(int arr[], int size, ofstream& output) { output << setw(6) << left << "N" << "Count" << endl; if (size == 0) return; int current = arr[0]; int count = 1; for (int i = 1; i < size; i++) { if (arr[i] == current) { count++; } else { output << setw(6) << left << current << count << endl; current = arr[i]; count = 1; } } // 输出最后一组数据 output << setw(6) << left << current << count << endl; }
内容的提问来源于stack exchange,提问作者p402
相关产品推荐
相关产品推荐

