你们有没有人知道是否有可能在C中更新文本文件(例如something.txt)? 我期待找到一个与update_txt(something.txt)语法相似的函数,但是在过去2小时浏览互联网时我没有找到任何东西..... 问题是我希望在已经打开的文本文件中实时存储和显示一些数据。我可以存储数据,但我无法找到显示它的方法而无需手动关闭文本文件然后再次打开它...
有人知道如何解决这个问题吗?或者你有另一种解决方法吗?我已经阅读了有关将数据传输到新文本文档然后重命名的内容,但我确信这不会解决我的问题。我还阅读了一些关于宏的内容,它可以检测文档中的更改,然后以某种方式刷新它。我从未使用过宏,我完全不知道它们是如何实现的。
但是请告诉我,是否无法更新已打开的文本文件?
我很感谢你们提供的任何建议或教程! :)
答案 0 :(得分:2)
这超出了C的范围;它需要一些特定于系统的文件系统监视机制。例如,inotify提供此功能
答案 1 :(得分:0)
首先,您可以使用rewind()
,fseek()
,ftell()
或fgetpos()
和fsetpos()
函数在文件中找到读指针。如果使用ftell()
或fgetpos()
记录更新记录的开始位置(起始偏移),您可以稍后使用fseek()
或fsetpos()
跳回该位置并读入已更改的数据。
潜伏在这里的另一个问题是,一般来说,你不能简单地“更新”文本文件。具体来说,如果替换文本与原始文本的长度不同,则会出现问题。您需要扩展或收缩文件。这通常通过在正确的位置进行所需编辑的副本,然后在原始文件上复制或移动文件的修改副本来完成。
检测其他进程何时修改文件仍然比较困难。不同的操作系统有不同的机制。对于Linux,它是inotify系统,例如。
答案 2 :(得分:0)
根据您的声明,如果没有手动关闭文本文件并再次打开它就无法显示它,则可能是缓冲区问题。使用C标准库调用(fopen
,fread
,fwrite
,fclose
等...)时,您编写的数据可能会缓存在用户空间中,直到缓冲区已满或文件已关闭。
要强制C库刷新缓冲区,请使用fflush(fp)
调用,其中fp是您的文件指针。
答案 3 :(得分:0)
关于: 但请告诉我是否无法更新已打开的文本文件? 是的,除非你拥有文件的句柄,否则不可能 ,(即FILE * fp = fopen(" someFilePath", " w +");)
关于: 是否可以更新C中的文本文件(例如something.txt)? 的 是的即可。如果您知道文件的位置,(someFileLocation,例如。" c:\ dev \ somefile.txt"),则打开它并写入。
使用FILE *fp = fopen(someFileLocation, "w+");
(打开现有文件进行追加)和fclose(fp);
的简单函数会这样做:以下是我用于记录的示例:
(注意,你必须注释掉,或者创建这个引用的其他函数,但是显示了一般概念)
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;
}
关于: 过去2小时浏览互联网。下次尝试
"在C&#34中写入文件的教程;在Google中,它列出了许多链接,包括:
这一个...... More On The Topic 。