我正在尝试浏览文件,直到找到两行,其中第一行的前4位与下一位的前4位不同。 为此,我一直在使用fseek来浏览它直到找到我想要的序列。这是一个十年来的人口清单,每十年都有不止一条线,但它们都是从最古老到最新的一年。 我在main中使用ftell获取第一个偏移量,以便我可以在文件的中间开始读取。
这里的问题是,即使偏移量为正且它应该转发,它也会继续向后移动。
应该让它向前发展的路线是:
encontrar_inicio(f, ano, offset/2);
这就是它所显示的:
1980 é maior que 1950 ano maior, anda para a frente
1980 é maior que 1910 ano maior, anda para a frente
1980 é maior que 1900 ano maior, anda para a frente
1980 é maior que 1880 ano maior, anda para a frente
1980 é maior que 1860 ano maior, anda para a frente
它说1980年比[年]大,前进。但事实并非如此。在给出这些行的printf之后是我在上面发布的行。
这就是整个功能:
void encontrar_inicio (FILE *f, int ano, long int offset)
{
int i, meio, ano2;
char aux[100], aux2[100], aux3[100], lixo[100];
//printf("%lu\n", offset);
fseek( f, offset, SEEK_SET);
fgets(aux, 100, f);
fgets(aux2, 5, f);
ano2 = atoi(aux2);
if(ano==ano2)
{
printf("%d é igual a %d anos iguais, anda para trás\n", ano, ano2);
encontrar_inicio(f, ano, -offset/2);//go back in the file
}
if(ano != ano2)
{ if(ano < ano2)
{
printf("%d é menor q %d ano menor, anda para trás\n", ano, ano2);
encontrar_inicio(f, ano, -offset/2);//go back in the file
}
if(ano > ano2)
{
printf("aqui\n");
fgets(lixo, 100, f);//next line
fgets(aux3, 5, f);
int ano3 = atoi(aux3);
if(ano==ano3)
{
printf("%d é igual a %d Encontrou o ano, começa a ler\n", ano, ano3);
return;
//começa a ler
}
if(ano!=ano3)
{
printf("%d é maior que %d ano maior, anda para a frente\n", ano, ano3);
encontrar_inicio(f, ano, offset/2); //go forward in the file
}
}
}
}
我一直在改变一些事情,但我不能比这更进一步。任何帮助,将不胜感激。
如果这个问题有任何问题我也会道歉,因为这是我的第一个问题。
它所读取的文件是这样的(几十年中间):
year,age,marst,sex,people
1850,0,0,1,1483789
1850,0,0,2,1450376
1850,5,0,1,1411067
2000,90,4,2,29292
2000,90,5,1,147615
2000,90,5,2,774069
2000,90,6,1,15627
2000,90,6,2,59113
编辑 - 结束这样做,它就像一个魅力。
void encontrar_inicio (FILE *f, int ano, long offsetmin, long offsetmax)
{
int ano2;
char aux[100], aux2[200], aux3[100], *aux4, lixo[100], lixo2[100];
long meio;
meio = (offsetmin+offsetmax)/2;
int anoinicio = inicio_ficheiro_ano(f);
if(ano==anoinicio)
{
printf("%d igual a %d, começar a ler", ano, anoinicio);
//inserir dados em;
return;
}
fseek( f, meio, SEEK_SET);
fgets(aux, 100, f);
fgets(aux2, 200, f);
aux4 = strtok(aux2, ",");
ano2 = atoi(aux4);
if(ano==ano2)
{
printf("%d é igual a %d anos iguais, anda para trás\n", ano, ano2);
//return;
encontrar_inicio(f, ano, offsetmin, meio);//go back in the file
}
if(ano != ano2)
{ if(ano < ano2)
{
printf("%d é menor q %d ano menor, anda para trás\n", ano, ano2);
//return;
encontrar_inicio(f, ano, offsetmin, meio);//go back in the file
}
if(ano > ano2)
{
fgets(lixo, 100, f);//next line
fgets(aux3, 5, f);
int ano3 = atoi(aux3);
if(ano==ano3)
{
printf("%d é igual a %d Encontrou o ano, começa a ler\n", ano, ano3);
fseek(f, -strlen(aux2), SEEK_CUR);
return;
//começa a ler
}
if(ano!=ano3)
{
printf("%d é maior que %d ano maior, anda para a frente\n", ano, ano3);
encontrar_inicio(f, ano, meio, offsetmax); //go forward in the file
}
}
}
}
答案 0 :(得分:0)
您可能想尝试使用以下内容更改第一个encontrar_inicio
encontrar_inicio(f, ano, offset/2);
(您的版本使用负偏移量)
在第二个:
encontrar_inicio(f, ano, offset + ((maxOffset - offset)/2));
(你的版本回来了,而不是前进.offset大于offset / 2)
答案 1 :(得分:0)
您可能希望使用SEEK_CUR
来查找当前位置,但SEEK_SET
绝对定位。