如何将内容从一个文本文件复制到另一个文本文件



我试图将文本文件"data"的内容复制到一个名为"raf"的文本文件。下面是"data"文件的内容:

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

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

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 filenn");
DisplayText(FullText);
RAF("raf.txt");
//printf("nn");
//printf("Display after Initializing Randon Access Filenn");
//DisplayRAF("raf.txt");
 printf("nnDisplay after Copying text to Random Access File");
 CopyText2RAF("data.txt","raf.txt");
 printf("nn");
 DisplayRAF("raf.txt");


 printf("nn");
 system("PAUSE");
 return 0;
 }
void DisplayText(char FullText[])
{
FILE * fp;
fp = fopen("data.txt","r");
int i;
printf("ID t NAME tt 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 tt 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);
}

出于某种原因,我将文本文件复制到RAF文件后,显示只读取到ID 60,然后重复直到For循环完成。我不明白为什么P被初始化为ID 70和80的内容没有被打印出来。ID 90根本没有打印。而是ID 60的信息。如有任何帮助或建议,不胜感激。

这里的问题是,当您打开文件以在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 

但是你会注意到最后一个缺失了。这是因为你在循环结束时从文本文件中读取值,然后循环回去,它在继续之前检查它是否在文件的末尾。所以它不会写最后一个。我将该函数修改为:

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 
90   Obama,Barack    900.90 
0    bbbb    0.00 

相关内容

  • 没有找到相关文章

最新更新