我的环境是win2000+VC6,用向导生成一简单SDI程序框架,在一菜单上添加一命令,其处理函数如下(本意是想把a文件中内容原样复制到b文件中):
void CMainFrame::OnWriteFile()
{
// TODO: Add your command handler code here
char str[1];//状态1,当为str[6]时为状态2
FILE *pFile, *pTemFile;
pFile = fopen("g:\\a.txt","r");
int i = 0;
char ch;
while (!feof(pFile))
{
ch = fgetc(pFile);
str[i++] = ch;
}
str[i-1] = 0;//状态4,当去掉此行时为状态3
pTemFile = fopen("g:\\b.txt","a");
fputs(str, pTemFile);
fclose(pTemFile);
fclose(pFile);
}a.txt的内容为"abcd"状态1和3时b.txt结果为"abcdB"
状态1和4时b.txt结果为"abcd"
状态2和3时b.txt结果为"abcd烫虗B"
状态2和4时b.txt结果为"abcd"请问如何解释?如何解决?
void CMainFrame::OnWriteFile()
{
// TODO: Add your command handler code here
char str[1];//状态1,当为str[6]时为状态2
FILE *pFile, *pTemFile;
pFile = fopen("g:\\a.txt","r");
int i = 0;
char ch;
while (!feof(pFile))
{
ch = fgetc(pFile);
str[i++] = ch;
}
str[i-1] = 0;//状态4,当去掉此行时为状态3
pTemFile = fopen("g:\\b.txt","a");
fputs(str, pTemFile);
fclose(pTemFile);
fclose(pFile);
}a.txt的内容为"abcd"状态1和3时b.txt结果为"abcdB"
状态1和4时b.txt结果为"abcd"
状态2和3时b.txt结果为"abcd烫虗B"
状态2和4时b.txt结果为"abcd"请问如何解释?如何解决?
1. 字符缓冲区的太小以至于产生溢出.
2. 字符口是以NULL做为结尾符的.最简单的解决:
void CMainFrame::OnWriteFile()
{
CopyFile("g:\\a.txt","g:\\b.txt",TRUE);
}你设想的解法
void CMainFrame::OnWriteFile()
{
// TODO: Add your command handler code here
FILE *pFile, *pTemFile;
pFile = fopen("g:\\a.txt","r");
fseek(pFile,0,SEEK_END);
int nLen=ftell(pFile)+1;
char* str=new char[nLen];
memset(str,0,nLen);
fseek(pFile,0,SEEK_SET);
fread(str,sizeof(char),nLen,pFile); pTemFile = fopen("g:\\b.txt","a");
fwrite(str,sizeof(char),nLen,pTemFile);
fclose(pTemFile);
fclose(pFile);
}