C语言中如何向remove()传字符串变量?remove()返回-1问题求助
问题分析与解决
首先明确:你提到的“数组返回其指针”表述基本准确——数组名在多数场景下会隐式转换为指向其首元素的指针,但你的问题里filepth本身就是const char*类型的指针,传递给remove()的方式是完全正确的,remove()返回-1和传参无关,核心问题出在文件未关闭以及其他潜在因素上。
remove()返回-1的常见原因及解决
原文件仍被打开
你在打开filepth对应的文件后,没有调用fclose(fp)就直接执行remove(),在Windows系统下,打开的文件会被锁定无法删除;类Unix系统中虽然允许删除打开的文件,但行为可能不符合预期。这是最可能的原因。
解决:在remove()前先关闭两个文件句柄:fclose(fp); fclose(fpdest); remove(filepth);权限不足
当前进程没有删除目标文件的权限(比如文件是只读属性,或者所在目录没有写入权限)。可以检查文件的权限设置,确保进程具备删除权限。文件路径问题
虽然fopen()成功打开了文件,但如果使用的是相对路径,后续remove()时的工作目录可能发生变化(不过你的函数里是连续执行,这种概率较低),可以尝试打印filepth确认路径是否正确。
修改后的完整函数
#include <errno.h> #include <stdio.h> int fmove(const char * filepth, const char * destpth) { FILE * fp = fopen(filepth, "r+"); FILE * fpdest = fopen(destpth, "w"); if ((fp != NULL) && (fpdest != NULL)) { char fpdata[999]; // 循环读取整个文件,原代码仅读取第一行 while (fgets(fpdata, sizeof(fpdata), fp) != NULL) { fputs(fpdata, fpdest); } // 先关闭文件再执行删除操作 fclose(fp); fclose(fpdest); if (remove(filepth) != 0) { // 打印具体错误信息辅助排查 perror("Failed to remove source file"); prtmessage("ERROR", "Cannot remove source file!"); return 1; } } else { prtmessage("ERROR", "Cannot move file!"); // 关闭已成功打开的文件,避免资源泄漏 if (fp != NULL) fclose(fp); if (fpdest != NULL) fclose(fpdest); return 1; } return 0; }
额外提示
- 原代码中
fgets仅读取一行数据,若要移动整个文件,必须通过循环读取直到文件结束。 - 引入
<errno.h>后,可使用perror()或strerror(errno)获取remove()失败的具体错误原因,更便于定位问题。
内容的提问来源于stack exchange,提问作者user21245403
相关产品推荐
相关产品推荐

