文件的交换存在一个冲突,冲突如何解决,将第一个文件的内容放入第二个文件的同时,将第二个文件的内容放入第一个文件,内容的保持用C语言避免出错怎么一个思路
本人基础知识不在解释,帖子是我自己编的一个例子,很好理解,尤其是对初学C语言的童鞋,希望大家可以从中了解到用C语言从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中
本例以一个书籍信息的结构体数组为例,包括其书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct /*书籍信息 包含书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格*/
{
int ID;
char name[100];
char author[100];
char brand[100];
int time;
int num;
int price;
}BOOK;
BOOK array[30];
int main()
{
FILE *fp = fopen("book.txt", "r");
int i=0;
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
//打开文件
while(fscanf(fp,"%d%s%s%s%d%d%d",&array[i].ID,array[i].name,array[i].author,array[i].brand,
&array[i].time,&array[i].num,&array[i].price)!=EOF)
{
i++;
}
fclose(fp);
//***这串代码是从文件book中读取一个结构体数组,注意这个i很重要,表示文件中一共有几个数组,下面要用到***
for( int ii = 0; ii < i; ii++)
{
if(array[ii].ID != 0)
printf("ID:%-10d name:%-18s author:%-10s brand:%-8s time:%-5d number:%-5d price:%d\n", array[ii].ID,
array[ii].name, array[ii].author, array[ii].brand, array[ii].time, array[ii].num, array[ii].price);
}
//***把数组读取出来***
int a;
printf("请输入你要删除书籍的ID:\n");
scanf("%d", &a);
for(int ii = 0; ii < i; ii++)
{
if(array[ii].ID == a)
{
array[ii].ID = 0;
break;
}
}
//把要删除的书籍ID变成0,下面把结构体数组读取到文件中时如果数组ID为0,则不读取到到文件中,这样这本书籍就删除了
fp = fopen("book.txt", "w");
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
//打开文件, 但和上面打开文件不太一样,“w”打开时会把文件中内容全部清空,而上面的“r”不会
for(int iii=0; iii < i ; iii++)
//iii<i表示只有i-1本书籍信息被存入文件
{
if(array[iii].ID != 0) //当书籍ID不为0时把书籍的信息读到文件中
{
fprintf(fp," %d %s %s %s %d %d %d\n",array[iii].ID,
array[iii].name, array[iii].author, array[iii].brand, array[iii].time, array[iii].num, array[iii].price);
}
}
getchar();
fclose(fp);
}
运行这串代码之前,你需要在你的编程软件创建的文件里里面创建一个文本文档
代码中就是从这个book文件里面读取数据
而book里面你可以输入和上面图片相似的内容。分别代表书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格
然后运行代码,最好一行表示一本书籍信息
然后输入你要删除书籍的ID,点击回车
你再次运行代码
你会发现你先前输入ID的书籍没了
**
针对文件交换的冲突问题,可以采用如下的思路:
首先,为了避免文件交换冲突,我们需要保证两个文件在操作时不会被其他进程或线程同时占用。
在C语言中,处理文件操作需要引入stdio.h头文件,利用fopen()函数打开文件,并采用fread()和fwrite()函数将文件内容读取到内存中并进行操作,最后通过fclose()函数关闭文件。在文件处理期间,操作系统会自动加锁,避免其他进程或线程的干扰。如下为代码示例:
#include <stdio.h>
int main() {
FILE *file1, *file2;
char buffer1[1024], buffer2[1024];
int size1, size2;
file1 = fopen("file1.txt", "rb");
if (file1 == NULL) {
printf("file1.txt 打开失败!");
return 1;
}
file2 = fopen("file2.txt", "rb");
if (file2 == NULL) {
printf("file2.txt 打开失败!");
return 1;
}
size1 = fread(buffer1, sizeof(char), 1024, file1);
size2 = fread(buffer2, sizeof(char), 1024, file2);
if (size1 != size2) {
printf("两个文件大小不同,交换失败!");
fclose(file1);
fclose(file2);
return 1;
}
fseek(file1, 0, SEEK_SET);
fseek(file2, 0, SEEK_SET);
fwrite(buffer2, sizeof(char), size2, file1);
fwrite(buffer1, sizeof(char), size1, file2);
fclose(file1);
fclose(file2);
return 0;
}
需要注意的事项:
希望这个思路对您有所帮助!