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

C语言将用户输入写入txt文件遇无限循环问题求助

解决你的C语言项目输入循环与二进制写入问题

看起来你的代码卡在了输入循环里,一直输出提示却没法接收用户输入,大概率是输入缓冲区处理不当或者scanf的使用有问题。我帮你梳理了需求并给出修复后的代码,同时解释关键要点:

核心需求回顾

  • 循环接收用户输入:零件号(整数)、数量(整数)、价格(浮点数)
  • 输入零件号为0时退出程序
  • 必须用fwrite以二进制模式写入文件

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

// 把三个数据打包成结构体,方便二进制写入
typedef struct {
    int part_number;
    int quantity;
    float price;
} Item;

int main() {
    FILE *file;
    Item item;
    int input_result;

    // 以二进制写入模式打开文件("wb"会覆盖原有内容,要追加就用"ab")
    file = fopen("items_data.txt", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }

    printf("=== Item Data Entry ===\n");
    printf("Enter part number, quantity, price (enter 0 as part number to exit)\n");

    while (1) {
        printf("\nPlease enter item data: ");
        // 读取三个值,同时检查输入是否成功
        input_result = scanf("%d %d %f", &item.part_number, &item.quantity, &item.price);

        // 触发退出条件:零件号为0
        if (item.part_number == 0) {
            break;
        }

        // 处理输入错误(比如用户输入了非数字)
        if (input_result != 3) {
            printf("❌ Invalid input! Please enter three valid numbers.\n");
            // 清理输入缓冲区的垃圾数据,避免无限循环
            while (getchar() != '\n');
            continue;
        }

        // 用fwrite写入二进制数据
        size_t written_count = fwrite(&item, sizeof(Item), 1, file);
        if (written_count != 1) {
            perror("Failed to write data to file");
            fclose(file);
            exit(EXIT_FAILURE);
        }

        printf("✅ Item saved successfully!\n");
    }

    // 一定要记得关闭文件
    fclose(file);
    printf("\nProgram exited. All data saved to items_data.txt.\n");

    return 0;
}

关键修复点解释

  1. 结构体封装数据
    把三个相关数据打包成结构体,fwrite可以一次性写入整个结构体的二进制数据,比单独写三个变量更高效、规整。

  2. 二进制文件打开模式
    用"wb"而不是普通的"w",二进制模式会避免系统自动转换换行符,保证写入的二进制数据准确(即使文件后缀是.txt也没问题)。如果需要追加数据而不是覆盖原有内容,改成"ab"即可。

  3. 处理scanf的返回值
    scanf会返回成功读取的变量个数,如果不是3,说明用户输入不符合要求(比如输了字母)。这时候必须清理输入缓冲区,否则残留的错误数据会导致下一次scanf直接失败,陷入无限循环输出提示的死胡同。

  4. 输入缓冲区清理
    当输入错误时,用while (getchar() != '\n')把缓冲区里的所有字符读到换行符为止,确保下一次scanf能接收新的输入。

  5. 退出条件的正确判断
    当用户输入的零件号为0时,直接break退出循环,符合需求。

原问题的根本原因

你原来的代码应该是没有检查scanf的返回值,也没有处理输入错误后的缓冲区清理。当输入出错时,scanf读取失败,错误数据留在缓冲区里,下一次循环又执行printf,然后scanf再次读取到错误数据,再次失败,导致无限循环输出提示。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:59:43