重命名函数在C中不起作用

重命名函数在C中不起作用,c,C,我创建了一个函数,更新文件的值,然后重命名它。 我的代码: void updatebook() { 系统(“CLS”); char*update[5]={malloc(30)、malloc(30)、malloc(30)、malloc(30)、malloc(30)}; int coop=0; 结构书; char oldfn[]=“d:/booksdata.txt”; char newfn[]=“d:/booksdata_temp.txt”; int deletecheck=0; char*myis

我创建了一个函数,更新文件的值,然后重命名它。 我的代码:

void updatebook()
{
系统(“CLS”);
char*update[5]={malloc(30)、malloc(30)、malloc(30)、malloc(30)、malloc(30)};
int coop=0;
结构书;
char oldfn[]=“d:/booksdata.txt”;
char newfn[]=“d:/booksdata_temp.txt”;
int deletecheck=0;
char*myisbnumber=malloc(4);
字符行[256];
char*pch;
int countcheck=0;
分配电子书(和书籍);
fp=fopen(旧fn,“r”);
fpa=fopen(新的fn,“w+”);
如果(fp==NULL | | fpa==NULL)
{
printf(“打开文件时出错!\n”);
出口(1);
}
printf(“输入要更新的图书的ISBN编号:\n”);
scanf(“%10s”,myisbnumber);
while(fgets(line,sizeof line,fp)!=NULL)
{
pch=strtok(行“,”);
while(pch!=NULL)
{
如果(countcheck==0)
book.name=pch;
else if(countcheck==1)
book.author=pch;
else if(countcheck==2)
book.bookserialnumber=pch;
否则如果(countcheck==3)
book.isbnnumber=pch;
否则如果(countcheck==4)
book.edition=pch;
否则如果(countcheck==5)
book.is_reserved=pch;
pch=strtok(空,“,”);
countcheck++;
}
if(strcmp(myisbnumber,book.isbNumber)!=0)
{
fprintf(fpa、%s、%s、%s、%s、%s、%s、\n)、图书名称、图书作者、图书编号、图书编号、isbnnumber、图书版本、图书编号保留);
}
其他的
{
deletecheck++;
重做更新:
系统(“CLS”);
coop=0;
printf(“您想更新什么:\n”);
printf(“1.名称\t%s\n2.作者\t%s\n3.序列号\t%s\n4.版本\t%s\n5.保留\t%s\n6.无需更新”;“图书.名称,图书.作者,图书.图书编号,图书.版本,图书.保留”);
scanf(“%d”和“合作社”);

如果(coop>0&&coop,
删除
-
重命名
代码看起来不错。代码还有一些其他问题,最明显的是Andrew Medico指出的
myisbnumber
的缓冲区溢出。你应该修复这个问题

还有一个内存泄漏,因为您从不释放任何内存“<代码> MalOC/<代码> -您应该考虑将它们分配为普通数组。堆栈应该能够处理额外的154字节(如果您更改<代码> MySbButix<代码> 161,以<代码> char MySbButt(11)< /代码>)。 但是,我认为这两个问题都不会导致您的问题(尽管您永远无法确定第一个问题,因为它会导致未定义的行为)。我认为问题是由于文件权限(从目录继承)造成的

该路径表示您正在Windows中工作。 您应该检查新创建的文件的权限。该目录可能有设置,因此不允许您重命名该文件。如果是这种情况,您可以通过更改目录权限或使用您具有完全访问权限的目录来解决问题。

来自ISO/IEC9899:

7.19.4.2重命名功能

概要

1
#包括

int重命名(常量字符*旧,常量字符*新);


从原型可以看出:您在错误的位置使用了新旧参数。

顺便说一句:您应该检查更新数组中的malloc没有返回NULL。
char*myisbnumber=malloc(4);
非常小。“整个代码工作正常”啊,不是。您的代码存在严重问题,例如使用
scanf
将最多10个字符读入4字节缓冲区(
myisbnumber
)。实际上一切正常。我真正的问题是在删除Get File Exist错误之前重命名你的方式代码。删除Get File Exist错误后重试Directory中不存在任何文件回答重写-第一个版本完全错误。实际上他不是。newfn是一个临时名称,他想在删除旧后将其重命名为oldfnde>oldfn
void UpdateBooks()
{
system("CLS");
char *update[5] = {malloc(30),malloc(30),malloc(30),malloc(30),malloc(30)};
int coop = 0;
struct Books book;
char oldfn[] = "d:/booksdata.txt";
char newfn[] = "d:/booksdata_temp.txt";
int deletecheck = 0;
char *myisbnumber = malloc(4);
char line[256];
char * pch;
int countcheck = 0;
allocatebooks(&book);
fp = fopen(oldfn,"r");
fpa = fopen(newfn,"w+");
if (fp == NULL || fpa == NULL)
{
    printf("Error opening file!\n");
    exit(1);
}
printf("Enter ISBN Number Of The Book You Want To Update:\n");
scanf("%10s",myisbnumber);

while (fgets(line,sizeof line,fp) != NULL)
{
    pch = strtok (line,",");
    while (pch != NULL)
    {
    if(countcheck == 0)
        book.name = pch;
    else if(countcheck == 1)
        book.author = pch;
    else if(countcheck == 2)
        book.bookserialnumber = pch;
    else if(countcheck == 3)
        book.isbnnumber = pch;
    else if(countcheck == 4)
        book.edition = pch;
    else if(countcheck == 5)
        book.is_reserved = pch;
    pch = strtok (NULL, ",");
    countcheck++;
    }
    if(strcmp(myisbnumber,book.isbnnumber) != 0)
    {
        fprintf(fpa,"%s,%s,%s,%s,%s,%s,\n",book.name,book.author,book.bookserialnumber,book.isbnnumber,book.edition,book.is_reserved);
    }
    else
    {
        deletecheck++;
        RedoUpdate:
        system("CLS");
        coop = 0;
        printf("What do you want to Update:\n");
        printf("1.Name\t  %s\n2.Author\t  %s\n3.Serial Number\t  %s\n4.Edition\t  %s\n5.Is_Reserved\t  %s\n6.Nothing to Update\n",book.name,book.author,book.bookserialnumber,book.edition,book.is_reserved);
        scanf("%d",&coop);
        if(coop > 0 && coop <= 5)
        {
            printf("Enter New Value\n");
            scanf("%s",update[coop]);
            if(coop == 1)
                book.name = update[coop];
            else if(coop == 2)
                book.author = update[coop];
            else if(coop == 3)
                book.bookserialnumber = update[coop];
            else if(coop == 4)
                book.edition = update[coop];
            else if(coop == 5)
                book.is_reserved = update[coop];
            goto RedoUpdate;
        }
        fprintf(fpa,"%s,%s,%s,%s,%s,%s,\n",book.name,book.author,book.bookserialnumber,book.isbnnumber,book.edition,book.is_reserved);
        printf("Updated!\n");
    }
    countcheck = 0;
}
if(deletecheck == 0)
    goto END;
if(fclose(fp) != 0)
    perror("File Not Closed FP\n");
if(fclose(fpa) != 0)
    perror("File Not Closed FPA\n");
if(remove(oldfn) == -1)
{
    perror("Remove Error");
    exit(1);
}
if(rename(newfn,oldfn) == -1)
{
    perror("Rename Error");
    exit(1);
}
printf("Completed!\n");
END:
getch();
}