怎么做可以把信息写入一个文件,并且可以读出来,要求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
```
我们首先定义了一个字符数组,每个数组元素都有它的地址,通过自定义函数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);//函数传参,传过去数组名,相当于数组首元素的地址
}