You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序输出文件写入异常:仅输出表头无统计内容求助

问题分析与修复

核心问题

你的代码在控制台输出正常但写入文件仅能输出表头,主要是头文件缺失导致格式控制符失效,加上prev初始化不规范的潜在问题。

具体修复点

  1. 补充必要头文件
    代码中使用了文件流、格式控制符,必须包含以下头文件,否则会导致setw、left等操作在文件流中无法正常工作,抑制后续内容输出:

    #include <iostream>
    #include <fstream>
    #include <iomanip>
    using namespace std;
    
  2. 修正prev的初始化方式
    用NULL初始化int类型变量是不规范的(NULL是指针常量),改为初始化一个数组中不存在的特殊值,避免逻辑异常:

    int prev = arr[0] - 1; // 取第一个元素减1,确保不等于任何数组元素
    
  3. 确保输出流正常刷新
    在关闭文件前显式调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:09:59