【问题标题】:Removing and renaming files with C error使用 C 错误删除和重命名文件
【发布时间】:2018-10-30 09:01:03
【问题描述】:

所以我正在尝试将数据从原始文件更新到一个新的临时文件,然后我删除原始文件并用原始文件的名称重命名临时文件,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(){
 FILE * fptr = NULL;
 FILE * temp;

    fptr = fopen("Original.txt", "rw+");
    temp = fopen("temp.txt", "w");

    if(fptr==NULL)//Check if file was opened successfully
    {
        printf("File could not be opened");
    }


    //cicle of me adding data to temp file

    fclose(fptr);
    fclose(temp);

    remove("Original.txt");
    rename("temp.txt","Original.txt");

    return 0;
    }

它第一次工作,但是当我再次执行时,Original.txt 最终为空白。是什么原因造成的?

我试过改变 temp = fopen("temp.txt", "w"); to temp = fopen("temp.txt", "ab+");但是 Original.txt 的信息最终没有空格或新行(全部在一起)。和“wb”一样

"rb" Original.txt 文件消失。

如果有必要,我会添加整个代码,虽然我认为它不相关

【问题讨论】:

  • 为什么要打开和关闭文件?
  • @phoxis 从我了解到的人们关闭文件然后他们删除或重命名
  • rw+ 有未定义的行为!
  • 为什么检查fptr为NULL,却不检查temp的状态?打开写入也可能失败。此外,错误消息应解释调用失败的原因,并写入标准错误。 if( (fp = fopen(path, mode)) == NULL ) { perror(path); ...}

标签: c file text


【解决方案1】:

当您执行fopen (path, "w") 时,它会截断path 指向的文件。然后你关闭文件。因此,本质上,您的“temp.txt”是fclose (temp) 行之后的一个空文件。去掉“w+”和“w”,因为它们会截断文件(使其长度为零)。

man fopen

w 将文件截断为零长度或创建文本文件以进行写入。 流位于文件的开头。

w+ 打开用于读写。如果文件不存在,则创建该文件,否则将其截断。流已定位 在文件的开头。

您根本不需要打开或关闭文件。如果您看到 removerename 绝对没有使用前一部分代码中的任何内容。还要检查man renameman remove。如果您想知道文件是否存在。检查这些函数的返回值。如果出现错误,您可以随时检查errno 以了解究竟出了什么问题。 (详见手册页)。

【讨论】:

  • 但是要写入 temp.txt 我必须打开它,对吗?
  • 如果你想写东西,那么你必须,但没有必要打开文件,因为renameremove函数接受文件路径,并且用于重命名和删除操作,使用这些路径在内部打开和关闭操作的文件。如果您想写入独立于删除和/或重命名的文件,则只需正常执行即可。如果要保留以前的内容,请使用追加模式“a”或“a+”作为追加和读取模式。
【解决方案2】:

不确定您到底要做什么,但根据您的问题,您只需要“r”模式即可阅读。

fptr = fopen("Original.txt", "r");

此外,还有一些建议,但没有回答您的问题:

  1. 您正在检查fptr == NULL,但仍继续写入数据?如果fptr == NULL 为真并且您尝试从空指针读取怎么办?除了输入错误消息外,还要输入return -1 或其他内容,这样程序就不会在这种情况下继续运行。

  2. 您也应该检查temp == NULL,以检测文件是否已打开以进行写入。如果temp == NULL 为真并且您尝试写入 NULL 指针怎么办?

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2016-12-20
    • 2012-08-15
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多