用C语言更新文本文件(可能吗?)

用C语言更新文本文件(可能吗?),c,text,macros,text-files,updating,C,Text,Macros,Text Files,Updating,你们中有谁知道是否可以用C语言更新文本文件(例如something.txt)? 我本来希望找到一个语法与update_txt(something.txt)类似的函数,但在过去的两个小时里我在浏览互联网时没有找到任何东西。。。。。 问题是,我希望在一个已经打开的文本文件中实时存储和显示一些数据。我可以存储数据,但如果不手动关闭文本文件,然后再次打开,我无法找到显示数据的方法 有人知道如何解决这个问题吗?或者你有别的办法解决它吗?我读过一些关于将数据传输到一个新的文本文档,然后重命名它的文章,但我确

你们中有谁知道是否可以用C语言更新文本文件(例如something.txt)? 我本来希望找到一个语法与update_txt(something.txt)类似的函数,但在过去的两个小时里我在浏览互联网时没有找到任何东西。。。。。 问题是,我希望在一个已经打开的文本文件中实时存储和显示一些数据。我可以存储数据,但如果不手动关闭文本文件,然后再次打开,我无法找到显示数据的方法

有人知道如何解决这个问题吗?或者你有别的办法解决它吗?我读过一些关于将数据传输到一个新的文本文档,然后重命名它的文章,但我确信这不会解决我的问题。我也读过一些关于宏的文章,这些宏可以检测文档中的更改,然后以某种方式刷新文档。我从未使用过宏,我完全不知道它们是如何实现的

但是,请告诉我,是否事实上不可能更新已打开的文本文档


我非常感谢你们提供的任何建议或教程!:)

这超出了C的范围;它需要一些特定于系统的文件系统监视机制。例如,提供此功能首先,您可以使用
倒带()
fseek()
ftell()
fgetpos()
fsetpos()
函数来定位文件中的读取指针。如果使用
ftell()
fgetpos()
记录写入更新记录的起始位置(起始偏移量),则可以稍后使用
fseek()
fsetpos()
跳回该位置并读取更改的数据

另一个潜在的问题是,一般来说,你不能简单地“更新”一个文本文件。特别是,如果替换文本的长度与原始文本的长度不同,则会出现问题。您需要展开或收缩文件。这通常是通过在正确位置使用所需编辑制作副本,然后在原始文件上复制或移动文件的修改副本来完成的


检测其他进程何时修改文件更加困难。在不同的操作系统中有不同的机制。例如,对于Linux,它是系统。

根据您的陈述,您“如果不手动关闭文本文件并再次打开它,则无法显示”,这可能是缓冲区问题。使用C标准库调用(
fopen
fread
fwrite
fclose
等)时,您写入的数据可能会在用户空间中进行缓冲,直到缓冲区已满或文件已关闭

要强制C库刷新缓冲区,请使用
fflush(fp)
调用,其中fp是您的文件指针。

关于:,但请告诉我是否无法更新已打开的文本文档是,除非您拥有该文件的句柄(即file*fp=fopen(“someFilePath”,“w+”),否则不可能

关于:是否可以用C语言更新文本文件(如something.txt?
。如果您知道文件的位置(someFileLocation,例如“c:\dev\somefile.txt”),则打开它并写入

使用
FILE*fp=fopen(someFileLocation,“w+”)的简单函数(打开现有文件进行追加)和
fclose(fp)可以做到这一点:下面是我用于日志记录的示例:

(注意,您必须注释掉,或创建此函数所指的其他函数,但显示了一般概念)

关于:在过去2小时内浏览互联网。下次试试
在谷歌的“用C编写文件教程”中,它列出了许多链接,包括:
这个<强> < /强> ./p>你是指将文本添加到文本文件中吗?程序是要写入文本文件的程序必须显示更新的数据吗?你使用的是代码>打开/读/写/代码>还是<代码> fOpen/Frad /Fuffy< /COD>?最严肃的软件(如文本处理器)是用C编写的(C++中的一些,我同意),所以答案是:是!威尔德普拉瑟:事实上,你不会错的。答案是‘不!’。(很明显,你最多只能交叉阅读这个问题)。我不确定为什么用C更新文本文件(例如something.txt)超出了C的范围???@Ryker well C提供了I/O原语,然而,OP使用术语“更新”同义词“检查实时修改”。这是/way/超出了C的范围,如果我没有记错的话,它甚至不需要文件系统。供参考。我明白你的观点。我想知道更新是否意味着“打开文件->编辑文件->关闭文件”。@Ryker请帮自己一个忙,认真阅读OP的问题。他不是在说修改文件。。。
int WriteToLog(char* str)
{
    FILE* log;
    char *tmStr;
    ssize_t size;
    char pn[MAX_PATHNAME_LEN];
    char path[MAX_PATHNAME_LEN], base[50], ext[5];
    char LocationKeep[MAX_PATHNAME_LEN];
    static unsigned long long index = 0;

    if(str)
    {
        if(FileExists(LOGFILE, &size))
        {
            strcpy(pn,LOGFILE);
            ManageLogs(pn, LOGSIZE);
            tmStr = calloc(25, sizeof(char));
            log = fopen(LOGFILE, "a+");
            if (log == NULL)
            {
                free(tmStr);
                return -1;
            }
            //fprintf(log, "%10llu %s: %s - %d\n", index++, GetTimeString(tmStr), str, GetClockCycles());
            fprintf(log, "%s: %s - %d\n", GetTimeString(tmStr), str, GetClockCycles());
            //fprintf(log, "%s: %s\n",  GetTimeString(tmStr), str);
            fclose(log);
            free(tmStr);
        }
        else
        {
            strcpy(LocationKeep, LOGFILE);
            GetFileParts(LocationKeep, path, base, ext);
            CheckAndOrCreateDirectories(path);
            tmStr = calloc(25, sizeof(char));
            log = fopen(LOGFILE, "a+");
            if (log == NULL)
            {
                free(tmStr);
                return -1;
            }
            fprintf(log, "%s: %s - %d\n", GetTimeString(tmStr), str, GetClockCycles());
            //fprintf(log, "%s: %s\n",  GetTimeString(tmStr), str);
            fclose(log);
            free(tmStr);
        }
    }
    return 0;
}