Jump to content
thinkabout

Acrescentar números às linhas - Debug Assertion Failed

Recommended Posts

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*/
}

Edited by thinkabout

Share this post


Link to post
Share on other 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);
}

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.