我有一个txt文件,我用这个函数读取它的每一行: txt文件就像这样
NOMLOT:300个
0001 :: 16:27 :: 47 :: 68:79:3 :::: 43:53 :: 71:81 :: 17:28:31 :: 59 ::: 85
0002:15 :: 32 :: 8 :: 74:79 :: 3 :::: 43:53 :: 71:81 :: 17:28:31 :: 59 ::: 85
我的get_line函数在这里
char *get_line(char *buf, int n, FILE *f, int line)
{
int i;
for (i=0 ;i<line;i++)
{
if(fgets(buf,n,f) == NULL)
return NULL;
buf[strlen(buf) - 1 ] = '\0';
}
return buf;
}
例如,如果我想打印第一行,它将如下所示:
char input[60];
get_line(input,TAILLE,fichier,ligne);
printf("1st line: \n");
for (i=0;i<60;i++)
{
printf("%c",input[i]);
}
我想要做的是,只读取300并将300转换为INT并保存,所以使用此值我可以循环我的程序从第二行开始读取所有现有行。
答案 0 :(得分:1)
好的,首先是评论。如果您按顺序读取文件(例如,读取第1行,然后读取第2行,然后读取第3行),则get_line()
函数的效率将非常低,因为您必须执行O(n ^ 2)行读取读n行。您应该找到一种方法来构建程序,以便您最多一次读取每一行。
假设您的input
缓冲区包含您想要的行(正则表达式"[^:]*:\d+"
,例如“NOMLOT:300”),您可以执行以下操作:
const char * num_pos = strtok(input, ":"); // get the position of the colon
if (! num_pos)
; // colon not found, so handle error
else
{
int num = atoi(num_pos + 1); // convert the string starting one char past the colon to an integer
// do processing now that you have the number...
}
答案 1 :(得分:1)
get_line(input,TAILLE,fichier,ligne);
printf("1st line: \n");
for (i=0;i<60 && input[i];i++){
printf("%c",input[i]);
}
int num;
if(1==sscanf(input, "NOMLOT:%d", &num)){
printf("\n%d\n", num);
}