Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-即使在删除文件后仍读取文件内容_C - Fatal编程技术网

C-即使在删除文件后仍读取文件内容

C-即使在删除文件后仍读取文件内容,c,C,检查这个程序 #include <stdio.h> int main() { FILE* f; char x[100]; f = fopen("a.txt","r"); int a = remove("a.txt"); sleep(5); fgets(x,100,f); printf("Remove() : %d\nFile Content : %s\n",a,x); printf("fclose() : %d

检查这个程序

#include <stdio.h>

int main()  {
    FILE* f;
    char x[100];
    f = fopen("a.txt","r");

    int a = remove("a.txt");

    sleep(5);
    fgets(x,100,f);
    printf("Remove() : %d\nFile Content : %s\n",a,x);

    printf("fclose() : %d\n",fclose(f));
    return 0;
}

删除一个文件实际上并不一定要“删除”它。发生的事情是对文件的引用被破坏。这有点像指针。您可以将代码与此进行比较:

void delete(int ** ptr)
{
    *ptr=NULL;
}

int main()
{
    int a=5;
    int p1=&a;
    int p2=&a;
    delete(p1);  // Pretty much equivalent to deleting a file
    printf("a: %d\n", *p1);  // We can still access it through a another pointer
}

删除一个文件实际上并不一定要“删除”它。发生的事情是对文件的引用被破坏。这有点像指针。您可以将代码与此进行比较:

void delete(int ** ptr)
{
    *ptr=NULL;
}

int main()
{
    int a=5;
    int p1=&a;
    int p2=&a;
    delete(p1);  // Pretty much equivalent to deleting a file
    printf("a: %d\n", *p1);  // We can still access it through a another pointer
}

它依赖于操作系统/实现。在Linux上,文件实际上是“挂起删除”,这意味着由于文件被打开,内核在实际释放文件占用的空间之前“等待”文件被关闭

执行
lsof
(可能会延长
睡眠时间
,让您有时间这样做)


显示您的程序进程维护打开的文件()。

它取决于操作系统/实现。在Linux上,文件实际上是“挂起删除”,这意味着由于文件被打开,内核在实际释放文件占用的空间之前“等待”文件被关闭

执行
lsof
(可能会延长
睡眠时间
,让您有时间这样做)


显示您的程序进程维护打开的文件()。

因为所有数据都已加载到RAM上,所以删除文件不会引起任何问题~Read answer by Alexander Pavlov。。它说
fopen()
只创建文件的句柄。您的查询/问题是什么,您试图实现什么?只想知道为什么可以这样做。如果您想在读取或打开文件之前删除文件,您需要在
打开
之前调用
删除
。当前实现文件的内容已经在RAM中,因此其行为符合预期。因为所有数据都已加载到RAM中,所以删除文件不会造成任何问题~读取Alexander Pavlov的答案。。它说
fopen()
只创建文件的句柄。您的查询/问题是什么,您试图实现什么?只想知道为什么可以这样做。如果您想在读取或打开文件之前删除文件,您需要在
打开
之前调用
删除
。当前实现文件的内容已经在RAM中,因此它的预期行为。
lsof | grep file