Ir para conteúdo
Fórum Script Brasil
  • 0

Problema BIZARRO: fprintf para de imprimir...


Felipe Amadio

Pergunta

Seguinte, coisas bizarras acontecem em C, e estou presenciando uma delas!

Me parece um erro do compilador, e como eu não entendo NADA de compilador, deve ser por isso que não consigo resolver o problema:

Como já postei algumas vezes aqui, tenho um programa que obtem dados de um arquivo externo, e vai fazendo contas, cada vez pegando um novo dado do arquivo externo, e imprimindo as contas em ou utro arquivo externo.

Estive trabalhando com dados em torno de 58mil linhas (cada linha tem um dado, que é um valor), e não tinha problemas. Eu gerava n arquivos (digitados pelo usuario) contendo essas 58mil linhas ou até um pouco menos, umas 2 mil a menos (uma constante definida pelas contas do programa).

E até aí, meu programa estava perfeito!

O problema é que meu chefe resolveu usar uns dados que possuem 66931 linhas (pra ser exato!) e comecei a ter problemas:

-meus arquivos de saída, todos eles, estão com algo em torno de 65mil linhas, só! as outras não estão aparecendo!

(nesse caso, não há as +ou- 2 mi linhas não escritas... são algo em terno de 20 ou 30 linhas a menos, só, e ele está me dando mais de 1500 linhas a menos!!!

Não consegui entender aonde estava o problema, então resolvi testar alternativas para ver se o problema se resolvia, e cheguei à alternativa mais bizarra de todas!!!

como forma de testar a impressão do arquivo, numa inicialização inicial, aonde somente o arquivo era lido, resolvi imprimir cada dado lido num outro arquivo de saida, para ver o que dava.

A principio, o mesmo problema: somente umas 65k linhas eram impressas.

Depois, resolvi DELETAR O RESTO DO PROGRAMA! simplesmente deixei o meu programa com a inicialização que descrevi acima, e, para minha surpresa, funcionou!!!!!

Voltei a colocar o resto do programa, e deu erro novamente!

e em nenhum ponto eu reedito o arquivo no resto do programa, então, explicitamente: se meu codigo está grande, ou completo, não imprime todas as linhas, com um codigo pequeno, imprime todas as linhas!

aí vai o codigo enxuto, somente com a inicializacao:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _FILE_OFFSET_BITS =64

int main()
{
 int i, j, filtro, mult, controle, div;
 int minactivefloat, volume, estoque, debito, maxactivefloat, passoactivefloat, activefloat;
 long vol1, vol2;
 double financeiro, Pestoque, Festoque, volmedia, volacumulado;
 double preco1, preco2, pct;
 char *strgp, *strgv1, *strgv2, *strgr, *str, *strcontrole, buf[100];
 char c1;
  FILE *p1, *v1, *p2, *v2, *pcto, *cont;


 i=0;
 volume = 0;
 financeiro = 0;
 Festoque = 0;
 Pestoque = 0;
 volacumulado = 0;
 strgp = "preço.txt";
 strgv1 = "vol.txt";
 strgv2 = "vol2.txt";
 strgr = "result.csv";


//Ajusta os separadores de decimal
 p1 = fopen(strgp,"r+");
fseek(p1,0,SEEK_END);
fprintf(p1,"*");
fseek(p1,0,SEEK_SET);
while (c1!='*')
{

    fscanf(p1,"%c",&c1);
    if (c1 == ',')
    {
        fseek(p1, -1, SEEK_CUR);
        fprintf(p1,".");
        fseek(p1, 1, SEEK_CUR);
    }

}
 v1 = fopen(strgv1,"r+");
fseek(v1,0,SEEK_END);
fprintf(v1,"*");
fseek(v1,0,SEEK_SET);
while (c1!='*')
{
    fscanf(v1,"%c",&c1);
    if (c1 == ',')
    {
        fseek(v1, -1, SEEK_CUR);
        fprintf(v1,".");
        fseek(v1, 1, SEEK_CUR);
    }
}

fclose(v1);
fclose(p1);
//fim


//---------------------------
    p1 = fopen(strgp,"r");
    p2 = fopen(strgp,"r");

//Calcula a média
v1 = fopen(strgv1,"r");
c1 = '0';
i=0;

 strcontrole = "controle.txt";
 cont = fopen(strcontrole,"w");

while (c1!='*')
{
    fscanf(v1,"%ld", &vol1);
    fprintf(cont,"%ld\n", vol1);
    volacumulado = volacumulado + vol1;
    i++;
    fscanf(v1,"%c", &c1);
    if (c1!='\n')
    {
        fscanf(v1,"%c", &c1);
        fseek(v1, -2, SEEK_CUR);
    }
    else
        fseek(v1, -1, SEEK_CUR);
}

volmedia = volacumulado/i;
printf("\nVolume Total = %lf\nNumero de Linhas = %ld\nMedia = %lf\n\n", volacumulado, i, volmedia);
fclose(v1);
//fim
return 0;
}

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Então, na verdade, acho que eu estava esbarrando em outro tipo de erro...

Como meu documento estava se limitando a 64-65mi linhas, e por ser um numero meio "chave", sei la, achei que pudesse ser algum problema de compilador, como eu disse...

Acontece que o erro real está na forma como eu checo se o arquivo chegou no fim!

Inicialmente, meus arquivos continham ; e \n depois de cada dada, e atualmente só tem \n, e eu estava verificando um caractere a mais, de forma que quando o numero a ser analisado era de apenas 1 algarismo, esse numero era pulado, e o arquivo de saida ficava com uma linha a menos...

O grande problema foi a coincidencia! o primeiro e único arquivo que eu usei que continha valores de apenas um algarismo, era este, com 69 mil linhas, e achei que era uma limitação do programa, ou algo assim, mas não! Era erro de programação!

Então, peço desculpas, desconsiderem o tópico, e podem feixá-lo/deletá-lo!

Muito obrigado de todo jeito!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...