C语言怎么编写文件代码呢

怎么做可以把信息写入一个文件,并且可以读出来,要求C语言,一直搞不好

用fopen打开文件,fwrite或fprintf等写入。然后用fread或fscanf读取

该回答引用ChatGPT

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

#define MAX_CAR_NUM 12 // 最多停放车辆数
#define MAX_LEN 20 // 车牌号最大长度
#define MAX_TIME 180 // 最长停车时间(单位:分钟)
#define CHARGE_RATE 0.2 // 停车费用每5分钟0.2元

typedef struct Car {
    char license[MAX_LEN]; // 车牌号
    int level; // 停车层数
    int slot; // 车位号
    int park_time; // 停车时间(单位:分钟)
} Car;

Car parking_lot[2][6]; // 停车场,二维数组表示两层停车场,每层6个车位
int parked_car_num = 0; // 当前停放的车辆数

int get_empty_slot(int level);

void load_data() {
    FILE* fp = fopen("car.dat", "r");
    if (!fp) {
        printf("无法打开数据文件,停车场将被初始化。\n");
        return;
    }

    while (!feof(fp)) {
        Car car;
        fscanf(fp, "%s %d %d %d", car.license, &car.level, &car.slot, &car.park_time);
        if (car.level < 0 || car.level > 1 || car.slot < 0 || car.slot > 5 || car.park_time < 0 || car.park_time > MAX_TIME) {
            printf("数据文件格式错误,停车场将被初始化。\n");
            fclose(fp);
            return;
        }

        strcpy(parking_lot[car.level][car.slot].license, car.license);
        parking_lot[car.level][car.slot].level = car.level;
        parking_lot[car.level][car.slot].slot = car.slot;
        parking_lot[car.level][car.slot].park_time = car.park_time;
        parked_car_num++;
    }

    fclose(fp);
}

void save_data() {
    FILE* fp = fopen("car.dat", "w");
    if (!fp) {
        printf("无法保存数据文件。\n");
        return;
    }

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 6; j++) {
            if (strlen(parking_lot[i][j].license) > 0) {
                fprintf(fp, "%s %d %d %d\n", parking_lot[i][j].license, parking_lot[i][j].level, parking_lot[i][j].slot, parking_lot[i][j].park_time);
            }
        }
    }

    fclose(fp);
}

void print_parking_lot() {
    printf("停车场状态如下:\n");
    for (int i = 0; i < 2; i++) {
        printf("第%d层:", i + 1);
        for (int j = 0; j < 6; j++) {
            if (strlen(parking_lot[i][j].license) > 0) {
                printf("%s ", parking_lot[i][j].license);
            } else {
                printf("空 ");
            }
        }
        printf("\n");
    }
}

void print_car_info(Car car) {
    printf("车牌号:%s\n", car.license);
    printf("停车层数:%d\n", car.level + 1);
    printf("车位号:%d\n", car.slot + 1);
    printf("停车时间:%d分钟\n", car.park_time);
}

void park_car() {
    if (parked_car_num == MAX_CAR_NUM) {
        printf("停车场已满,无法停车。\n");
        return;
    }

    char license[MAX_LEN];
    printf("请输入车牌号:");
    scanf("%s", license);

    int level = -1, slot = -1;
    for (int i = 0; i < 2; i++) {
        int empty_slot = get_empty_slot(i);
        if (empty_slot >= 0) {
            level = i;
            slot = empty_slot;
            break;
        }
    }

    if (level < 0 || slot < 0) {
        printf("停车场已满,无法停车。\n");
        return;
    }

    Car car;
    strcpy(car.license, license);
    car.level = level;
    car.slot = slot;
    car.park_time = 5;

    parking_lot[level][slot] = car;
    parked_car_num++;

    save_data();

    printf("车辆已成功停放在第%d层第%d个车位上。\n", level + 1, slot + 1);
}

int get_empty_slot(int level) {
    for (int i = 0; i < 6; i++) {
        if (strlen(parking_lot[level][i].license) == 0) {
            return i;
        }
    }
    return -1;
}

void unpark_car() {
    char license[MAX_LEN];
    printf("请输入车牌号:");
    scanf("%s", license);

    int level = -1, slot = -1;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 6; j++) {
            if (strcmp(parking_lot[i][j].license, license) == 0) {
                level = i;
                slot = j;
                break;
            }
        }
        if (level >= 0 && slot >= 0) {
            break;
        }
    }

    if (level < 0 || slot < 0) {
        printf("未找到该车辆,请确认车牌号是否正确。\n");
        return;
    }

    Car car = parking_lot[level][slot];
    int charge = (car.park_time + 4) / 5 * CHARGE_RATE * 10; // 计算停车费用
    printf("停车费用:%d元\n", charge);

    parking_lot[level][slot] = (Car){ "", -1, -1, -1 };
    parked_car_num--;

    save_data();

    printf("车辆已成功离开停车场。\n");
}

void print_all_cars_info() {
    printf("停车场中共有%d辆车:\n", parked_car_num);
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 6; j++) {
            if (strlen(parking_lot[i][j].license) > 0) {
                printf("第%d层第%d个车位:", i + 1, j + 1);
                print_car_info(parking_lot[i][j]);
            }
        }
    }
}

void exit_system() {
    printf("欢迎下次再来!\n");
    exit(0);
}

int main() {
    load_data();

    while (1) {
        printf("欢迎使用停车场管理系统,请选择以下操作:\n");
        printf("1. 停车\n");
        printf("2. 取车\n");
        printf("3. 输出停车场中全部车辆的信息\n");
        printf("4. 退出系统\n");

        int choice;
        printf("请输入操作编号:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                park_car();
                break;
            case 2:
                unpark_car();
                break;
            case 3:
                print_all_cars_info();
                break;
            case 4:
                exit_system();
                break;
            default:
                printf("无效操作,请重新输入。\n");
                break;
        }

        print_parking_lot();
    }

    return 0;
}

#include <stdio.h>

int main() {
    // 打开文件以进行写入
    FILE *fptr = fopen("example.txt", "w");
    if (fptr == NULL) {
        printf("打开文件时出错!");
        return 1;
    }
    // 写入文件
    fprintf(fptr, "Hello, world!");
    // 关闭文件
    fclose(fptr);
    // 打开文件以进行读取
    fptr = fopen("example.txt", "r");
    if (fptr == NULL) {
        printf("打开文件时出错!");
        return 1;
    }
    // 从文件中读取
    char buffer[100];
    fgets(buffer, 100, fptr);
    printf("%s", buffer);
    // 关闭文件
    fclose(fptr);
    return 0;
}

```c


```

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/226080
  • 这篇博客也不错, 你可以看下C语言创建多个文件,命名,打开写入关闭及解决乱码问题
  • 除此之外, 这篇博客: c语言字符串逆序总结与辨析中的 指针,数组逆序打印字符串,不改变字符串的内容 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我们首先定义了一个字符数组,每个数组元素都有它的地址,通过自定义函数reverse一个一个字符的向后找,直到找到最后一个元素的地址。再通过循环的方式,从最后一个数组的地址倒着打印字符串到开始的字符。数组的方式也是一样找到最后一个元素的下标,逆着打印就行。
    【指针逆序】

    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    void reverse(char *p)//定义一个指针来接收
    {
    	char *tem = p;
    	while (*p != '\0')
    	{
    		p++;
    	}
    	while (tem <= p)
    	{
    		printf("%c", *(p - 1));
    		p--;
    
    	}
    }
    int main()
    {
    	char arr[20] = "0";
    	printf("请输入一串字符串,中间可以有空格\n");
    	gets(arr);//用gets来接收这个字符数组,gets可以接收空格;而scanf遇到空格,回车和Tab键都会默认为输入结束,所以它不能接收空格
    	reverse(arr);//函数传参,传过去数组名,相当于数组首元素的地址
    }
    
    

    【数组逆序】

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    void reverse(char* arr)//
    {
    	int i = 0;
    	int  z = strlen(arr)-1;//数组下标从0开始,找到最后一个元素的下标
    	for (i = z; i >= 0; i--)
    	{
    
    		printf("%c", arr[i]);
    
    	}
    
    }
    int main()
    {
    	char arr[20] = "0";
    	printf("请输入一串字符串,中间可以有空格\n");
    	gets(arr);
    	reverse(arr);//函数传参,传过去数组名,相当于数组首元素的地址
    }