gpt4 book ai didi

c - 我正在编写一个程序来更改文件位置。但它无法正常工作

转载 作者:行者123 更新时间:2023-11-30 16:33:33 25 4
gpt4 key购买 nike

我调试了很多次。该程序可以在新位置创建新文件,但新文件不包含源文件中的内容。指针 s 没有值。请告诉我为什么会出现这个问题并帮助我解决它。

这是我在 source.cpp 中的函数:

#include "Header.h"

void changeFileLoc(char filename[],char location[])
{
char newname[255];
sprintf(newname, "%s\\%s\0", location, filename);
FILE* fp = fopen(filename, "rb");
if (fp!=NULL)
{
char*s = (char*)malloc(sizeof(char)*sizeofFile(fp));
FILE* f = fopen(newname, "wb");
fread(s, sizeof(char)*sizeofFile(fp), 1, fp);
fwrite(s, sizeof(char)*sizeofFile(fp), 1, f);
fclose(fp);
fclose(f);
free(s);
}
}
long sizeofFile(FILE *f)
{
fseek(f, 0, SEEK_END);
long kq = ftell(f);
rewind(f);
return kq;
}

这是我的主要内容:

#define _CRT_SECURE_NO_WARNINGS
#include "Header.h"
void main()
{
changeFileLoc("randombinary.txt", "D:\\Game");
_getch();
}

这是我的标题:

 #ifndef __HEADER_H__
#define __HEADER_H__
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>

long sizeofFile(FILE *f);
int FileExist(char filename[]);
void changeFileLoc(char filename[], char location[]);

#endif

最佳答案

虽然很脆弱,但发布的代码可以在我的机器上运行。也就是说,应该通过错误检查使其更加健壮。这些检查可能会帮助您快速确定您的案例出了什么问题。其他一些最佳实践也将使代码更容易理解(从而更容易调试)。

首先,请注意,您用来确定文件大小的方法并不能保证可以按照语言标准进行移植 - ftell 返回的值实际上只是有用的为寻求。也就是说,它会在 Linux 上做正确的事情。如果文件以二进制模式打开(就像在您的程序中一样),它也可以在 Windows 上运行。

接下来,更清晰地命名将有助于避免错误。 fpf 在这里不是很有用。诸如 sourcetargetsrcdestoldfile 的名称>newfile 将大大有助于避免错误。变量 kq 似乎没有意义,除非它是其他语言中文件大小的缩写。甚至 changeFileLoc 这个名称也具有误导性; copyFileToLoc 会更合适。

changeFileLoc 的内部结构令人困惑,因为所有操作都是交错的:首先它构造新文件的名称,然后打开旧文件并创建一个缓冲区来保存它,然后打开旧文件新文件,然后读取旧文件,然后写入新文件。这是相当困惑的。这会导致变量生命周期不必要地重叠,从而更容易编写错误。

还有一条原则叫做“不要重复自己”,通常缩写为 DRY。像计算文件大小三倍这样的事情不仅效率低下,而且会使代码变得困惑,使得更难看出发生了什么。计算一次并将其保存到一个命名良好的变量将使这更容易理解。

额外的困惑包括不必要的转换、多余的字符串终止和乘以 1(如果只发生在一个地方,情况也不会那么糟糕)。

所以让我们将这些原则应用到代码中:

// Returns the size of the file in bytes, or 0 if the size cannot
// be determined.
long sizeofFile(FILE *f) {
if (fseek(f, 0, SEEK_END) != 0) {
return 0;
}
long size = ftell(f);
rewind(f);
return size;
}

void copyFileToLoc(char filename[], char location[]) {
FILE *source = fopen(filename, "rb");
if (source != NULL) {
size_t size = sizeofFile(source);
char *s = malloc(size);
if (s != NULL) {
fread(s, 1, size, source);
fclose(source);

char newname[255];
sprintf(newname, "%s\\%s", location, filename);

FILE *target = fopen(newname, "wb");
if (target != NULL) {
fwrite(s, 1, size, target);
fclose(target);
}
free(s);
}
}
}

这更好了,但仍然不是很好。我们检查了一些错误,但没有检查其他错误(例如,freadfwrite 可能会失败)。即便如此,我们已经开始走向箭头代码反模式(代码大量缩进)。可能值得将其分解为更小的函数。

关于c - 我正在编写一个程序来更改文件位置。但它无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com