用C语言更新文本文件(可能吗?)
你们中有谁知道是否可以用C语言更新文本文件(例如something.txt)? 我本来希望找到一个语法与update_txt(something.txt)类似的函数,但在过去的两个小时里我在浏览互联网时没有找到任何东西。。。。。 问题是,我希望在一个已经打开的文本文件中实时存储和显示一些数据。我可以存储数据,但如果不手动关闭文本文件,然后再次打开,我无法找到显示数据的方法 有人知道如何解决这个问题吗?或者你有别的办法解决它吗?我读过一些关于将数据传输到一个新的文本文档,然后重命名它的文章,但我确信这不会解决我的问题。我也读过一些关于宏的文章,这些宏可以检测文档中的更改,然后以某种方式刷新文档。我从未使用过宏,我完全不知道它们是如何实现的 但是,请告诉我,是否事实上不可能更新已打开的文本文档用C语言更新文本文件(可能吗?),c,text,macros,text-files,updating,C,Text,Macros,Text Files,Updating,你们中有谁知道是否可以用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;
}