gpt4 book ai didi

c - C语言编程,获取文件的最后一行

转载 作者:行者123 更新时间:2023-12-02 06:18:12 25 4
gpt4 key购买 nike

我正在编写一个打开txt文件的c程序,并想读取txt文件的最后一行。
我不太精通C语言,因此请记住,我可能不了解C语言中的所有概念。我被困在使用fscanf读取txt文件的所有行的部分,但我想保留最后一行txt文件,并获取如下所述的值。

这是我不完整的代码:

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

FILE *sync;


void check()
{
int success; //to hold the results if the timestamps match
sync = fopen("database.txt","r");
char file[] = "database.txt";

while (fscanf(sync, "%d.%06d", &file) != EOF)
{


}

fclose(sync);
}

样本txt文件:
/////// / //// ///// ///// //////////////// Time: 1385144574.787665 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787727 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787738 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787746 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787753 //////// /

/是我不需要的一些单词,符号和数字,只是示例txt中的数字,如上所示

我感谢任何示例并指出了我犯的错误,以便可以更好地理解这一点。
由于我使一些人对文本文件感到困惑,所以这才是真正的含义。这是它的格式,所以我应该知道每行的长度。但是,由于更新,我将不知道会有多少行。
 Socket: 0 PGN: 65308 Data: 381f008300000000 Time: 1385144574.787925 Address: 28
Socket: 0 PGN: 65398 Data: 0000000100000000 Time: 1385144574.787932 Address: 118
Socket: 0 PGN: 61444 Data: f07d83351f00ffff Time: 1385144574.787940 Address: 4
Socket: 0 PGN: 65266 Data: 260000000000ffff Time: 1385144574.787947 Address: 242
Socket: 0 PGN: 65309 Data: 2600494678fff33c Time: 1385144574.787956 Address: 29
Socket: 0 PGN: 65398 Data: 0000000100000000 Time: 1385144574.787963 Address: 118
Socket: 0 PGN: 61444 Data: f07d833d1f00ffff Time: 1385144574.787971 Address: 4
Socket: 0 PGN: 65398 Data: 0000000100000000 Time: 1385144574.787978 Address: 118
Socket: 0 PGN: 61443 Data: d1000600ffffffff Time: 1385144574.787985 Address: 3
Socket: 0 PGN: 65308 Data: 451f008300000000 Time: 1385144574.787993 Address: 28
Socket: 0 PGN: 65317 Data: e703000000000000 Time: 1385144574.788001 Address: 37

同样,我在txt文件的最后一行的时间值(例如1385144574.787925)之后。
希望这可以帮助。

最佳答案

使用fscanf的方式是错误的,因为参数的实际 vector 必须与所收集的内容匹配(如联机帮助页中所示)。除了使用fscanf之外,您还可以考虑使用fgets,然后通过sscanf使用正则表达式过滤最新的原始内容。

注意::我以双格式收集了值,您可以选择最适合您的问题的格式(字符串?int.int?float?),为此,您应该使用scanf检查 regex 。如果您无法完成此任务,请回来。

更新::由于某些请求,我写了一些不同模式匹配的示例。这些应该是解决问题的一个很好的起点。

更新::
1.我已经看到您添加了db文件的模式,因此我们现在可以声明#3和#4都匹配,并将3放在此处(更快)。
2.我已根据您的请求删除了 feof 支票,但是请注意,如果您知道自己在做什么,则支票是可以的。基本上,您必须记住流的内部位置指示符可能指向下一个操作的文件结尾,但是,直到操作试图在该点读取时,文件结尾指示符可能才被设置
3.您要求删除字符行[1024] = {0,};该指令用于初始化line [1024]数组,该数组将包含您从文件中读取的行。这是必需的!要知道该指令是什么,请参阅here

码:

void check()
{
char line[1024]={0,}; // Initialize memory! You have to do this (as for your question)
int n2=0;
int n3=0;
sync = fopen("database.txt", "r");
if( sync ) {
while( fgets(line, 1024, sync) !=NULL ) {
// Just search for the latest line, do nothing in the loop
}
printf("Last line %s\n", line); //<this is just a log... you can remove it
fclose(sync);
// This will look for Time and it will discard it collecting the number you are looking for in n2 and n3
if (sscanf(line, "%*[^T]Time: %d.%d", &n2, &n3) ) {
printf( "%d.%d\n", n2, n3);
}
}
}

示例2
例如,如果您需要使用两个整数来收集值,则需要将以下示例的sscanf替换为以下代码:
  unsigned int n2, n3;
if (sscanf(line, "%*[^0-9]%d.%d", &n2, &n3) ) {
printf( "%d.%d\n", n2, n3);
}

说,您应该弄清楚如何收集其他格式。

示例3
更好的正则表达式。如果在给定模式之前文件中还有其他数字,您可能想按时间进行匹配,那么可以说之前没有任何T。正则表达式可以是:
 if (sscanf(line, "%*[^T]Time: %d.%d", &n2, &n3) ) {
printf( "%d.%d\n", n2, n3);
}

使用sscanf的正则表达式可能不适合您的模式,在这种情况下,您需要考虑gnu regex library的用法,或者可以像下面的示例中那样混合使用strstr和sscanf。

示例4
如果找不到通用模式,这将很有用。在这种情况下,您可能需要在调用strstr之前使用sscanf触发字符串“Time”
  char *ptr = strstr( line, "Time:" );
if( ptr != NULL ) {
if (sscanf(ptr, "%*[^0-9]%d.%d", &n2, &n3) ) {
printf( "%d.%d\n", n2, n3);
}
}

*注意*
您可能需要找到解析文件的方法,而上述方法仅是建议,因为您的文件中可能包含更具体或不同的模式,但是我在此处发布的说明应足以为您提供完成该任务所需的工具案件

关于c - C语言编程,获取文件的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com