- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我调试了很多次。该程序可以在新位置创建新文件,但新文件不包含源文件中的内容。指针 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 上运行。
接下来,更清晰地命名将有助于避免错误。 fp
和 f
在这里不是很有用。诸如 source
和 target
、src
和 dest
或 oldfile
和 的名称>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);
}
}
}
这更好了,但仍然不是很好。我们检查了一些错误,但没有检查其他错误(例如,fread
或 fwrite
可能会失败)。即便如此,我们已经开始走向箭头代码反模式(代码大量缩进)。可能值得将其分解为更小的函数。
关于c - 我正在编写一个程序来更改文件位置。但它无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713810/
我是一名优秀的程序员,十分优秀!