C语言 将一个磁盘文件中的信息复制到另一个磁盘文件中,要求使用 fread fwrite这两个函数来实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 将一个磁盘文件中的信息复制到另一个磁盘文件中,要求使用 fread fwrite这两个函数来实现相关的知识,希望对你有一定的参考价值。

我自己也有写一个,不过感觉不太对(代码如下),指点下我的程序或者重新写一个都行哈,谢谢啦~
#include<stdio.h>
#define SIZE 4

struct student_type

char name[10];
int num;
int age;
char addr[15];
stud[SIZE];

void save()

FILE *fp;
int i;
if((fp=fopen("stu_1","w"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
if( fwrite( &stud[i],sizeof(struct student_type),1,fp )!=1 )
printf("file write error\n");
fclose(fp);


void load()

FILE *fp;
int i;
if((fp=fopen("stu_1","r"))==NULL)

printf("cannot open infile\n");
return;

for(i=0;i<SIZE;i++)
if(fread(&stu_1,sizeof(struct student_type),1,fp)!=1)//读取stu_1文件中的信息,直到读不出信息(读到文件尾了),跳出循环。循环体中就是打印读到的信息和令存文件
printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
fclose(fp);

void save1()

FILE *fp;
int i;
if((fp=fopen("stu_2","w"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
if( fwrite( &stud[i],sizeof(struct student_type),1,fp )!=1 )
printf("file write error\n");
fclose(fp);


int main()

int i;
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
save();
load();
save1();
return 0;

其中的函数save是新建一个文件,load读这个文件,save1把这个文件的内容复制到另外一个文件

save是新建文件,应该不需要去write把,它创建一个文件就OK了,
其实save1就可以把创建和写内容一起作了,这样就可以少一次对创建文件的开关。
参考技术A 你的程序对的啊,就是这里大意了
if(fread(&stu_1,sizeof(struct student_type),1,fp)!=1)//读取stu_1文件中的信息,直到读不出信息(读到文件尾了),跳出循环。循环体中就是打印读到的信息和令存文件
/////////if(fread(&stud[i],sizeof(stru
参考技术B 如果你将整个结构体写入,再整个结构体读出,可能会有字节对齐所产生的乱码问题。可以将结构体的每个数据,一个一个的写入,然后一个一个的读出。

如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?

我正在尝试将一些文件移动到一个单独的存储库,保存其更改的历史记录并尝试节省磁盘空间,因为原始存储库超过5 GB但与新存储库相关需要<50 MB。

所以,我把所有需要移动到新存储库的文件移动到一个单独的分支中,创建了一个新的存储库。使用以下git命令,我能够保留历史记录,但新存储库变得占用与原始磁盘空间相同的磁盘空间:

git remote add originalreporemote **path**
git fetch originalreporemote 
git merge originalreporemote/branchwithfilestomove --allow-unrelated-histories
git remote rm originalreporemote

查看新的存储库大小,我发现它与原始存储库大小相同。这对我来说太过分了,因为将来我不需要在新版本中引用原始存储库的完整历史记录。

我移动到新存储库的文件历史应该占用更少的空间。

UPD

我理解可能很难理解这个问题,因此您可以按照步骤重现它:

让我添加一些步骤,让您轻松重现问题:

  1. 创建两个存储库,
  2. 将文本文件提交到repo1的主分支,因此需要几KB,
  3. 在repo1中创建一个新分支,
  4. 结帐回到repo1的主分支,
  5. 将几个大文件添加到repo1并将它们提交给repo1的主服务器。所以现在repo1包含2个分支 - 带有大文件和文本文件的主分支以及仅带有文本文件的步骤#3中的第二个分支,
  6. 尝试将步骤#3中的第二个分支从第一个存储库推送到第二个存储库,保留其更改的历史记录(命令在上面),
  7. 我希望在此操作之后,第二个存储库的大小将与步骤#3中的KB相同,但实际上它与第一个存储库的大小相同。
答案

你提到“几个大文件(例如mp3文件)”让我觉得你应该使用Git LFS,虽然看起来你今天没有这样做。这样可以保存完整的Git历史记录,同时在Git外部存储大块blob,从而保持存储库大小:

Git大文件存储(LFS)用Git中的文本指针替换大型文件,如音频样本,视频,数据集和图形,同时将文件内容存储在远程服务器(如GitHub.com或GitHub Enterprise)上。

我认为这是一个更清洁的解决方案,它得到GitHub,GitLab和Bitbucket的云产品以及GitHub Enterprise和自托管GitLab的支持,或者你可以set it up yourself

简而言之,要转换现有存储库:

  1. 为您的操作系统安装Git LFS客户端
  2. 使用git lfs install在存储库中启用LFS
  3. 告诉Git要存储在LFS中的文件,例如:通过运行git lfs track '*.mp3'
  4. 添加生成的.gitattributes文件并提交
  5. 删除并重新添加MP3: git rm --cached *.mp3 git add *.mp3 git commit -m 'Move MP3s to Git LFS'
  6. 如果你想“缩小”旧的提交,你还必须使用filter-branch重写历史记录

This guide可能完全值得一读。

以上是关于C语言 将一个磁盘文件中的信息复制到另一个磁盘文件中,要求使用 fread fwrite这两个函数来实现的主要内容,如果未能解决你的问题,请参考以下文章

怎么复制文件到另一个文件夹上?

如何把FTP中的文件复制到本地文件夹

C语言编程中如何将一个文件中的信息转入到另一个文件

windows常用命令整理

用c语言写一个职工工资管理程序

如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?