我正在编写一个打开txt文件的ac程序,想要读取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);
}
Run Code Online (Sandbox Code Playgroud)
示例txt文件:
/////// / //// ///// ///// //////////////// Time: 1385144574.787665 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787727 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787738 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787746 //////// /
/////// / //// ///// ///// //////////////// Time: 1385144574.787753 //////// /
Run Code Online (Sandbox Code Playgroud)
/是我不想要的一些单词,符号和数字,只是上面显示的示例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
Run Code Online (Sandbox Code Playgroud)
我再次在txt文件的最后一行之后的时间值(例如1385144574.787925).希望这可以帮助.
由于你是在文件的最后一行之后,而你没有提到文件的大小,所以从最后开始阅读文件可能是值得的,并从那里开始向后工作:
FILE *fp = fopen("database.txt", "r");
fseek(fp, 0, SEEK_END);//sets fp to the very end of your file
Run Code Online (Sandbox Code Playgroud)
从那里,您可以使用fseek(fp, -x, SEEK_CUR);x是您想要返回的字节数,直到您到达您想要的位置...除此之外,Jekyll的答案应该可以正常工作.
但是,要获得最后一行,我倾向于做这样的事情:
FILE *fp = fopen("database.txt", "r");
char line[1024] = "";
char c;
int len = 0;
if (fp == NULL) exit (EXIT_FAILURE);
fseek(fp, -1, SEEK_END);//next to last char, last is EOF
c = fgetc(fp);
while(c == '\n')//define macro EOL
{
fseek(fp, -2, SEEK_CUR);
c = fgetc(fp);
}
while(c != '\n')
{
fseek(fp, -2, SEEK_CUR);
++len;
c = fgetc(fp);
}
fseek(fp, 1, SEEK_CUR);
if (fgets(line, len, fp) != NULL) puts(line);
else printf("Error\n");
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
我的lenvar 背后的原因是我可以分配足够的内存来容纳整行.使用1024个字符的数组就足够了,但是如果你想安全地玩它:
char *line = NULL;
//read line
line = calloc(len+1, sizeof(char));
if (line == NULL)
{
fclose(fp);
exit( EXIT_FAILURE);
}
//add:
free(line);//this line!
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
一旦你获得了这一行,你可以使用Jekyll的sscanf例子来确定从该行中提取你想要的任何东西的最佳方法.
| 归档时间: |
|
| 查看次数: |
11212 次 |
| 最近记录: |