文件的交换存在一个冲突,将第一个文件的内容放入第二个文件的同时,将第二个文件的内容放入第一个文件,内容的保持用C语言避免出错怎么一个思路

文件的交换存在一个冲突,冲突如何解决,将第一个文件的内容放入第二个文件的同时,将第二个文件的内容放入第一个文件,内容的保持用C语言避免出错怎么一个思路

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7596858
  • 你也可以参考下这篇文章:C语言之结构体 现有36名教师,每个教师包括教工号,姓名,工资共三项基本信息,请用C语言编程,从键盘上输入每一位教师的基本信息,并打印输出工资最高者的工号,姓名工资和所有教师的平均工资
  • 除此之外, 这篇博客: C语言结课大作业(图书馆超市寝室):从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中中的 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语言入门篇课程中的 文件概述,文本、二进制文件区别小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对文件交换的冲突问题,可以采用如下的思路:

    1. 首先,为了避免文件交换冲突,我们需要保证两个文件在操作时不会被其他进程或线程同时占用。

    2. 在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;
    }
    
    1. 在上述代码中,我们首先打开要交换的两个文件file1和file2,通过fread()函数将文件内容读取到buffer1和buffer2中,在确认两个文件大小一致后,我们使用fwrite()函数通过将buffer2向file1写入、将buffer1写入file2完成文件交换操作。最后,别忘记关闭文件。

    需要注意的事项:

    • 在读取文件之前,应先判断文件是否打开,如果打开失败,需要做出错误提示并退出程序;
    • 以二进制方式打开文件时要加上"b";
    • 一定要记得关闭文件,否则会造成文件句柄泄漏和系统资源浪费。

    希望这个思路对您有所帮助!

https://ask.csdn.net/questions/7955454/54221454