You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何向remove()传字符串变量?remove()返回-1问题求助

问题分析与解决

首先明确:你提到的“数组返回其指针”表述基本准确——数组名在多数场景下会隐式转换为指向其首元素的指针,但你的问题里filepth本身就是const char*类型的指针,传递给remove()的方式是完全正确的,remove()返回-1和传参无关,核心问题出在文件未关闭以及其他潜在因素上。

remove()返回-1的常见原因及解决

  1. 原文件仍被打开
    你在打开filepth对应的文件后,没有调用fclose(fp)就直接执行remove(),在Windows系统下,打开的文件会被锁定无法删除;类Unix系统中虽然允许删除打开的文件,但行为可能不符合预期。这是最可能的原因。
    解决:在remove()前先关闭两个文件句柄:

    fclose(fp);
    fclose(fpdest);
    remove(filepth);
    
  2. 权限不足
    当前进程没有删除目标文件的权限(比如文件是只读属性,或者所在目录没有写入权限)。可以检查文件的权限设置,确保进程具备删除权限。

  3. 文件路径问题
    虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:07