如何在C语言中将内容从一个文本文件复制到另一个文本文件

如何在C语言中将内容从一个文本文件复制到另一个文本文件,c,function,text,struct,randomaccessfile,C,Function,Text,Struct,Randomaccessfile,我试图将文本文件“data”的内容复制到一个名为“raf”的文本文件中。以下是“数据”文件的内容: 我的目标是获得如下输出: ID NAME BALANCE --------------------------------------- 10 Nixon,Kathy 100.10 20 Reagan,Ronald 200.20 30 Clinton,Bill 300.30 40 Bush,Bar

我试图将文本文件“data”的内容复制到一个名为“raf”的文本文件中。以下是“数据”文件的内容:


我的目标是获得如下输出:

ID       NAME            BALANCE
---------------------------------------
10       Nixon,Kathy     100.10
20       Reagan,Ronald   200.20
30       Clinton,Bill    300.30
40       Bush,Barba      400.40
50       Carter,Jimmy    500.50
60       Bush,George     60.60
0        bbbb             0.00
0        bbbb             0.00
90     Obama,Barack      900.90
0        bbbb             0.00
ID       NAME            BALANCE
---------------------------------------
10       Nixon,Kathy     100.10
20       Reagan,Ronald   200.20
30       Clinton,Bill    300.30
40       Bush,Barba      400.40
50       Carter,Jimmy    500.50
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60


Press any key to continue . . .

然而这就是我实际得到的

ID       NAME            BALANCE
---------------------------------------
10       Nixon,Kathy     100.10
20       Reagan,Ronald   200.20
30       Clinton,Bill    300.30
40       Bush,Barba      400.40
50       Carter,Jimmy    500.50
60       Bush,George     60.60
0        bbbb             0.00
0        bbbb             0.00
90     Obama,Barack      900.90
0        bbbb             0.00
ID       NAME            BALANCE
---------------------------------------
10       Nixon,Kathy     100.10
20       Reagan,Ronald   200.20
30       Clinton,Bill    300.30
40       Bush,Barba      400.40
50       Carter,Jimmy    500.50
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60
60       Bush,George     60.60


Press any key to continue . . .

这是我目前的代码:

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



struct PERSON
{
int ID;
char name[20];
float balance;

};


void DisplayText(char FullText[]);
void RAF(char *fname);
void DisplayRAF(char *fname);
void CopyText2RAF(char* txtname, char* rafname);


int main()
{
char FullText[500];

printf("Display text file\n\n");
DisplayText(FullText);
RAF("raf.txt");

//printf("\n\n");
//printf("Display after Initializing Randon Access File\n\n");
//DisplayRAF("raf.txt");

 printf("\n\nDisplay after Copying text to Random Access File");
 CopyText2RAF("data.txt","raf.txt");
 printf("\n\n");

 DisplayRAF("raf.txt");




 printf("\n\n");
 system("PAUSE");
 return 0;

 }

void DisplayText(char FullText[])
{
FILE * fp;
fp = fopen("data.txt","r");
int i;

printf("ID \t NAME \t\t BALANCE \n");
printf("---------------------------------------\n");
for(i=0;i<7; i++)
{
    fgets(FullText,500,fp);
    printf("%s", FullText);
}

printf("\n");

free(FullText);
fclose(fp);
}

void RAF(char *fname)
{
FILE * f;
struct PERSON p = {0 , "bbbb", 0.0};

// OPEN THE RAF FILE
f = fopen(fname,"wb");

//INITIALIZE THE FILE WITH RECORD p
int i;
for(i=1; i<=10; i++)
{
   fwrite((char *)&p,sizeof(p),1,f);
}

fclose(f);
}

void DisplayRAF(char *fname)
{
FILE * f = fopen(fname,"rb");
struct PERSON p;

int i;
printf("ID \t NAME \t\t BALANCE \n");
printf("---------------------------------------\n");

for(i=1; i<=10; i++)
{
    fread((char *)&p, sizeof(p),1,f);
    printf("%d \t %s \t %.2f \n",p.ID, p.name, p.balance);
}

fclose(f);
}

void CopyText2RAF(char* txtname, char* rafname)
{
FILE * ftxt = fopen(txtname,"r");
FILE * fraf = fopen(rafname,"wb");



//READ FROM TEXT FILE
struct PERSON p;
fscanf(ftxt, "%d %s %f", &p.ID, p.name, &p.balance);

while(! feof(ftxt))
{
    int ByteOfText = ((p.ID/10-1)*sizeof(p));
    fseek(fraf,ByteOfText, SEEK_SET);
    fwrite((char *)&p, sizeof(p), 1, fraf);
    fscanf(ftxt, "%d %s %f", &p.ID, p.name, &p.balance);
}

fclose(ftxt);
fclose(fraf);
}
#包括
#包括
#包括
结构人
{
int-ID;
字符名[20];
浮动天平;
};
无效显示文本(字符全文[]);
无效RAF(字符*fname);
void DisplayRAF(char*fname);
作废CopyText2RAF(字符*txtname,字符*rafname);
int main()
{
字符全文[500];
printf(“显示文本文件\n\n”);
显示文本(全文);
英国皇家空军(“RAF.txt”);
//printf(“\n\n”);
//printf(“初始化Randon访问文件后显示\n\n”);
//DisplayRAF(“raf.txt”);
printf(“\n\n将文本复制到随机访问文件后显示”);
CopyText2RAF(“data.txt”、“raf.txt”);
printf(“\n\n”);
DisplayRAF(“raf.txt”);
printf(“\n\n”);
系统(“暂停”);
返回0;
}
void DisplayText(字符全文[])
{
文件*fp;
fp=fopen(“data.txt”,“r”);
int i;
printf(“ID\t NAME\t\t BALANCE\n”);
printf(“---------------------------------------\n”);

对于(i=0;i而言,这里的问题是,当您在
CopyText2RAF
函数中打开文件进行更新时,您会使用:

FILE * fraf = fopen(rafname,"wb");
这将打开一个空文件进行写入,并销毁任何以前存在的内容。这就是为什么您没有任何以前写入的数据

相反,你想使用

FILE * fraf = fopen(rafname,"r+b");
r+
表示您希望打开该文件进行读写操作(并且该文件必须已经存在)

对您的程序进行此更改并运行后,我得到了以下结果:

将文本复制到随机访问文件后显示

ID   NAME        BALANCE 
---------------------------------------
10   Nixon,Kathy     100.10 
20   Reagan,Ronald   200.20 
30   Clinton,Bill    300.30 
40   Bush,Barba      400.40 
50   Carter,Jimmy    500.50 
60   Bush,George     60.60 
0    bbbb    0.00 
0    bbbb    0.00 
0    bbbb    0.00 
0    bbbb    0.00 
ID   NAME        BALANCE 
---------------------------------------
10   Nixon,Kathy     100.10 
20   Reagan,Ronald   200.20 
30   Clinton,Bill    300.30 
40   Bush,Barba      400.40 
50   Carter,Jimmy    500.50 
60   Bush,George     60.60 
0    bbbb    0.00 
0    bbbb    0.00 
90   Obama,Barack    900.90 
0    bbbb    0.00 
但是,您会注意到缺少最后一个。这是因为您在循环结束时从文本文件中读取值,然后返回,它会在继续之前检查该值是否位于文件结尾。因此它不会写入最后一个。 我将该函数修改为以下内容:

void CopyText2RAF(char* txtname, char* rafname)
{
    FILE * ftxt = fopen(txtname,"r");
    FILE * fraf = fopen(rafname,"r+b");

    //READ FROM TEXT FILE
    struct PERSON p;

    while(! feof(ftxt))
    {
        int ByteOfText;
        fscanf(ftxt, "%d %s %f", &p.ID, p.name, &p.balance);
        ByteOfText = ((p.ID/10-1)*sizeof(p));
        fseek(fraf,ByteOfText, SEEK_SET);
        fwrite((char *)&p, sizeof(p), 1, fraf);
    }

    fclose(ftxt);
    fclose(fraf);
}
现在它产生了以下结果:

将文本复制到随机访问文件后显示

ID   NAME        BALANCE 
---------------------------------------
10   Nixon,Kathy     100.10 
20   Reagan,Ronald   200.20 
30   Clinton,Bill    300.30 
40   Bush,Barba      400.40 
50   Carter,Jimmy    500.50 
60   Bush,George     60.60 
0    bbbb    0.00 
0    bbbb    0.00 
0    bbbb    0.00 
0    bbbb    0.00 
ID   NAME        BALANCE 
---------------------------------------
10   Nixon,Kathy     100.10 
20   Reagan,Ronald   200.20 
30   Clinton,Bill    300.30 
40   Bush,Barba      400.40 
50   Carter,Jimmy    500.50 
60   Bush,George     60.60 
0    bbbb    0.00 
0    bbbb    0.00 
90   Obama,Barack    900.90 
0    bbbb    0.00