Ir para o conteúdo
thinkabout

Acrescentar números às linhas - Debug Assertion Failed

Mensagens Recomendadas

thinkabout

Se for a linha de comandos e executar a sntaxa ele já está a acrescentar os números se bem que ainda me come uma letra.

Mas para já a minha luta é outra e não consigo fazer sentindo dela.

"Debug Assertion Failed!

Program: .....xpto.exe

file f:\dd\vctools\crt_bld\Self_x86\crt\src\fopen.c

Line 54

Expression: (file!=NULL)"

Caso faço retry no erro dá-me. (breskpoint)

_VALIDATE_RETURN((file != NULL), EINVAL, NULL);

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
Ex3.
Desenvolva uma função que adicione o número da linha a um programa em código C guardado
num ficheiro de texto. O resultado deve ser armazenado no mesmo ficheiro. O nome do ficheiro a
alterar deve ser passado como argumento da função.
*/
void main(int argc, char*argv[])
{

   int i=0,n=0;
   char c;

 char st[500];
   FILE *f,*g;

 f=fopen(argv[1],"r");
   if (f == NULL)
 {
   printf("Erro de abertura do ficheiro\n");
 exit(1);
 }

 g=fopen(argv[2],"w"); //VOU GUARDAR NOUTRO FICHEIRO PARA NAO ESTRAGAR f
  if (g == NULL)
 {
   printf("Erro de abertura do ficheiro para escrita\n");
 exit(2);
 }
   while(fread(&c,sizeof(char),1,f)==1)
   {
   fgets(st,500,f);
   fprintf(g,"%d\t",n++);
   fputs(st,g);
   }		  

   fclose(f);
  fclose(g);
}

edited:

Já bomba sem erros agora tenho é que acertar a string.

Estava a usar argv antes de usar argc.

/* Testar a Linha de Comando */
if (argc!=3)
{
 printf("Sintaxe: \n\n%s Origem Destino\n\n",argv[0]);
 exit(1); /*Termina o Programa*/
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Aceitam-se sugestões apesar de já tá a bombar :)


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
Ex3.
Desenvolva uma função que adicione o número da linha a um programa em código C guardado
num ficheiro de texto. O resultado deve ser armazenado no mesmo ficheiro. O nome do ficheiro a
alterar deve ser passado como argumento da função.
*/
void main(int argc, char*argv[])
{

int i=0,n=0;
char c;
int retorno;
char st[500];
FILE *original,*destino;

/* Testar a Linha de Comando */
if (argc!=3)
{
printf("Sintaxe: \n\n%s Origem Destino\n\n",argv[0]);
exit(1); /*Termina o Programa*/
}

original=fopen(argv[1],"r"); // Abrir o ficheiro para leitura.
if (original == NULL)
{
printf("Erro de abertura do ficheiro\n");
exit(2);
}

destino=fopen(argv[2],"w"); //VOU GUARDAR NOUTRO FICHEIRO PARA NAO ESTRAGAR f
if (destino == NULL)
{
printf("Erro de abertura do ficheiro para escrita\n");
exit(3);
}


while (fgets(st, 500, original) != NULL) 
{
// fgets -> A onde vai ser armezenada a string lida, quantos caracteres vou ler, de onde vou ler.

fprintf(destino,"%d ",n++); // Responsável por os números nas linhas
// fprintf -> Onde quero gravar, o tipo de variavel que quero gravar, a variavel que vou gravar.
retorno = fputs(st,destino);
// fputs -> O arquivo que abri, o arquivo para onde quero por as coisas. 
if (retorno == EOF)
{
puts("Erro a gravar");
exit(5);
}

}              

fclose(original);
fclose(destino);
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Aceitam-se sugestões ...

1) indentação

2) usa int main(...). O uso de void main(...) não é garantido funcionar em todos os sistemas que aceitam C. Ao usar void main estás a limitar o alcance do teu programa desnecessariamente.

3) usa sizeof para especificar o numero de bytes a ler no fgets(). Qualquer dia achas que é melhor lidar com linhas até 2000 caracteres duma vez e alteras o tamanho do array ... mas precisas também de alterar a quantidade na linha do fgets(). Usando sizeof só precisas de alterar na definição do array.

/* ... */
char st[2000];
/* ... */
while (fgets(st, sizeof st, original) != NULL)
/* ... */

4) Não é costume numerar ficheiros começando na linha zero

5) Se usares os especificadores de "field width" no printf() o resultado fica, a meu ver, mais "bonito"

fprintf(destino, "%6d ", n++);


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

:) a cena do sizeof faz toda a lógica e estava-me a passar.

Já corrigi

1 Maria 7

2 João 9

3 Zé 2

4 Rute 3

5 Manuela 9

A indentação... quando copio para aqui fica sempre estúpida:( , deve existir forma de corrigir isso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

A indentação... quando copio para aqui fica sempre estúpida:( , deve existir forma de corrigir isso.

Faz o post em modo de edição "básico", sem aquelas coisas de bold, tamanho de letra, smileys, etc.

Podes mudar o modo de edição clicando no primeiro botão da zona de escrita da mensagem (parece um interruptor).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.