Ir ao conteúdo

Posts recomendados

Postado

Comecei a fazer o código, criei um loop para ler e passa-lo para csv, mas o mesmo imprime números aleatórios e não lê as Strings.

alguém poderia me ajudar nisso? Abaixo segue meu código e arquivos.

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main(){

const int TAM = 130;
int mat[TAM][TAM];
char delimitador = ';';

FILE *arquivo = fopen("ARQ01.txt", "w");
void ler();{
    for (int i=0; i<TAM; i++) {
        for (int j=0;j<TAM;j++) {
            mat[i][j] = rand();
            fprintf(arquivo, "%i%c", mat[i][j], delimitador);
        }
        fprintf(arquivo, "\n");
    }
    fclose(arquivo);

    puts("Matriz preenchida");
    system("pause");
    
}
}

ARQ01.txt LAYOUT.pdf

Postado

Use o botão code. Poste os dados no tópico, o arquivo e o layout. Ajude os outros a ajudarem você

7 minutos atrás, Weverson Meireles disse:

void ler();{
    for (int i=0; i<

 

Declarou uma função no leio de outra?

 

Não use uma função void e sem argumentos. É um buraco negro e não serve para quase nada. Passe parâmetros. Retorne algo.

Postado

Esse é o meu segundo código, consegui ler o conteúdo do arquivo “ARQ01.txt”, agora como poderia fazer para passar para CSV? 
 

/* ==========================================================
Aluno:
Data: 01/01/2021 (data atual)
Programa: Faça um programa que leia o arquivo ARQ01.txt, com base no layout LAYOUT.PDF, e escreva o seu conteúdo no formato CSV (*1).
Exercicio: Lista 02 / letra 
==========================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main (void){
    

FILE *arquivo;

arquivo = fopen ("ARQ01.txt", "r");

if(arquivo == NULL){
    printf("não foi possível abrir o arquivo\n");
    getchar();
    exit(0);
}

char frase[2000];
while (fgets(frase, 2000, arquivo) != NULL){
    printf("%s", frase);
    
}

fclose(arquivo);

}

 

Este é o conteúdo do arquivo: 

 

 

001 14/05/2021 Exportacao F

002 12012435 Nilo Pontes Sousa 17/02/2000 F

002 21910420 Miguel Veiga Carrilho 26/11/1997 F

002 31813713 Teresinha Fragoso Fontinha 14/01/1997 F

002 41615446 Jordan Belchiorinho Lagos 02/09/1996 F

002 52011977 Iara Quinteiro Melancia 14/02/1996 F

002 62010992 Neusa Gomide Canario 02/04/2002 F

002 71711935 Abdul Modesto Pureza 27/01/1992 F

002 82020657 Ludmila Frade Capistrano 09/05/1995 F

002 91704871 Kyami Furtado Mafra 19/05/1978 F

002 101615740 Carmen Guedelha Sacadura 16/03/1997 F

002 111911901 Jonas Rosa Regodeiro 18/05/1992 F

002 122011094 Lucia Redondo Lisboa 06/09/1997 F

002 131714919 Josefina Loio Banha 09/12/1996 F

002 141512419 Paloma Tabosa Quintal 29/09/1998 F

002 152112795 Flavia Ornelas Ribeiro 07/03/2001 F

002 162011978 Salomao Conde Ramos 11/01/2000 F

002 172012217 Mirian Vinhas Souto 06/02/1999 F

002 182012184 Axel Moita Camacho 10/10/1991 F

002 192020139 Lyana Pedro Noronha 22/11/2000 F

002 202012047 Ronaldo Braga Netto 22/07/2000 F

Postado

USE o tal botão code

 

veja a diferença

 

/* ==========================================================
Aluno:
Data: 01/01/2021 (data atual)
Programa: Faça um programa que leia o arquivo ARQ01.txt,
com base no layout LAYOUT.PDF, e escreva o seu conteúdo
no formato CSV (*1).
Exercicio: Lista 02 / letra 
==========================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main (void){
    

FILE *arquivo;

arquivo = fopen ("ARQ01.txt", "r");

if(arquivo == NULL){
    printf("não foi possível abrir o arquivo\n");
    getchar();
    exit(0);
}

char frase[2000];
while (fgets(frase, 2000, arquivo) != NULL){
    printf("%s", frase);
    
}

fclose(arquivo);

}

 

E os dados

 

001 14/05/2021 Exportacao F
002 12012435 Nilo Pontes Sousa 17/02/2000 F
002 21910420 Miguel Veiga Carrilho 26/11/1997 F
002 31813713 Teresinha Fragoso Fontinha 14/01/1997 F
002 41615446 Jordan Belchiorinho Lagos 02/09/1996 F
002 52011977 Iara Quinteiro Melancia 14/02/1996 F
002 62010992 Neusa Gomide Canario 02/04/2002 F
002 71711935 Abdul Modesto Pureza 27/01/1992 F
002 82020657 Ludmila Frade Capistrano 09/05/1995 F
002 91704871 Kyami Furtado Mafra 19/05/1978 F
002 101615740 Carmen Guedelha Sacadura 16/03/1997 F
002 111911901 Jonas Rosa Regodeiro 18/05/1992 F
002 122011094 Lucia Redondo Lisboa 06/09/1997 F
002 131714919 Josefina Loio Banha 09/12/1996 F
002 141512419 Paloma Tabosa Quintal 29/09/1998 F
002 152112795 Flavia Ornelas Ribeiro 07/03/2001 F
002 162011978 Salomao Conde Ramos 11/01/2000 F
002 172012217 Mirian Vinhas Souto 06/02/1999 F
002 182012184 Axel Moita Camacho 10/10/1991 F
002 192020139 Lyana Pedro Noronha 22/11/2000 F
002 202012047 Ronaldo Braga Netto 22/07/2000 F

 

2 horas atrás, Weverson Meireles disse:

agora como poderia fazer para passar para CSV? 

 

Seu programa não faz nada ainda. Para o formato CSV apenas coloque o delimitador dos campos. Como parece não ter nada no enunciado o normal é a vírgula. Só isso: valores separados por vírgula --- Comma Separated Values.

Postado

Criei um delimitador e informei o tamanho dos meus campos, mas não consigo criar uma forma de loop para fazer com que  lesse as linhas  e imprima no arquivo o formato CSV. Estou com dificuldade, pesquisei sobre o tal botão CODE mas não consegui compreender como se encaixaria. Poderia me dar uma luz de como fazer? 

 

char delimitador = ';';
int Fixo[3];
int matricula[10];
char nome[50];
int data[10];
int fixof[2];

 

 

Postado
22 minutos atrás, Weverson Meireles disse:

mas não consigo criar uma forma de loop para fazer com que  lesse as linhas  e imprima no arquivo o formato CSV


O loop é o mesmo do seu programa. Cada linha da entrada gera uma linha na saída. O delimitador padrão é a vírgula, de onde vem o nome CSV como eu expliquei, e não ';' . Apenas coloque os separadores.

 

Sobre o botão code tem o exemplo que eu deixei e o post fixo no forum, o primeiro deles... Com esse sugestivo título:

 

Botão code <> : como e para que usar?

 

 

 

Postado
7 minutos atrás, arfneto disse:

Apenas coloque os separadores.

A duvida gerada, foi que, no meu loop eu fiz com que lesse tudo sem separar dentro do arquivo. Agora como faria para separar?

O que vem em mente para separar com virgula, seria armazenando em vetores, porém nem assim estou conseguindo.

Postado
1 hora atrás, arfneto disse:
while (fgets(frase, 2000, arquivo) != NULL){
    printf("%s", frase);

 

? Não entendi sua dúvida. Cada linha vai estar dentro disso, frase. Apenas insira os delimitadores. Tente com uma planilha como o Google Planilhas

 

Está certo de que sabe o que é um arquivo CSV?

 

Veja duas linhas do seu arquivo numa planilha no programa do Google

 

image.png.bb456c3aa54950499553affa70e82fc2.png

 

A primeira linha é opcional, com o nome dos campos. A gente usa por exemplo quando vai para um banco de dados para definir já o nome das colunas. Isso é algo dos anos 80.

 

Usando o próprio programa Planilhas pode salvar como csv, sem sair do navegador Chrome, e teria isso

 

Campo1,Matricula,Nome,Data,Campo5
2,62010992,Neusa Gomide Canario,02/04/2002,F
2,71711935,Abdul Modesto Pureza,27/01/1992,F

 

É só isso que tem que fazer em seu programa, sem a primeira linha....

 

002 62010992 Neusa Gomide Canario 02/04/2002 F

 

Vira 

 

2,62010992,Neusa Gomide Canario,02/04/2002,F

 

Nada foi mostrado em aula?

 

Eis o formato https://datatracker.ietf.org/doc/html/rfc4180. CSV não tem de fato um RFC porque é anterior ao IETF e a internet e o W3C, não é como por exemplo DHCP ou SMTP ou algum dos protocolos associados à internet. 

 

 

 

 

Postado
33 minutos atrás, arfneto disse:

Cada linha vai estar dentro disso, frase. Apenas insira os delimitadores. Tente com uma planilha como o Google Planilhas

Você esta certo quanto as definições. 

 

38 minutos atrás, arfneto disse:
2,62010992,Neusa Gomide Canario,02/04/2002,F

Eu só não consigo criar um programa que faça essa delimitação pra mim e imprimi-la em um arquivo .txt (por exemplo) para gerar o CSV como foi dito. 

Postado
3 minutos atrás, Weverson Meireles disse:

Você esta certo quanto as definições. 

 

Sim, mas não é minha opinião. É a documentação oficial e está embutido em tudo, do Excel ao Planilhas ao SQL Server, MySQL, até os programas de imprimir etiquetas.

 

5 minutos atrás, Weverson Meireles disse:

Eu só não consigo criar um programa que faça essa delimitação pra mim e imprimi-la em um arquivo .txt (por exemplo) para gerar o CSV como foi dito

 

Mas eu te mostrei o exemplo. e como testar. Ao abrir seu CSV com o Planilhas vai aparecer tudo arrumadinho, um campo por coluna. E terá testado seu programa.

 

Apenas leia frase e coloque os delimitadores, linha a linha. Nada mais.

 

Postado
26 minutos atrás, arfneto disse:

Apenas leia frase e coloque os delimitadores, linha a linha. Nada mais.

Eu tentei fazer com que ele lesse frase e colocasse os delimitadores, mas na hora de escrever no arquivo, ele não mostra as strings apenas números aleatórios.

Esse foi um dos que tentei fazer mostrar o modelo com virgula:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main (void){
    

FILE *arquivo;

arquivo = fopen ("ARQ01.txt", "w");

if(arquivo == NULL){
    printf("não foi possível abrir o arquivo\n");
    getchar();
    exit(0);
}

char frase[2000];
int delimitador = ',';

while (fgets(frase, 2000, arquivo) != NULL){
    printf("%s", frase);
    
}
fprintf(arquivo, "%i%c", frase, delimitador);

fclose(arquivo);

}    

Postado
7 minutos atrás, Weverson Meireles disse:

Esse foi um dos que tentei fazer mostrar o modelo com virgula:

parece que não leu mesmo o tópico sobre o tal botão code...

 

É difícil copiar código assim e muitas vezes vem com erros por causa do código do site...

Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main (void){
    

FILE *arquivo;

arquivo = fopen ("ARQ01.txt", "r");

if(arquivo == NULL){
    printf("não foi possível abrir o arquivo\n");
    getchar();
    exit(0);
}

char frase[2000];
int delimitador = ',';

while (fgets(frase, 2000, arquivo) != NULL){
    printf("%s", frase);
    
}
fprintf(arquivo, "%s%c", frase, delimitador);

fclose(arquivo);

}

 

Postado
fprintf(arquivo, "%i%c", frase, delimitador);

 

Mas o que pretende com essa linha? 

 

Tem que SEPARAR os campos com o separador. TODOS eles. E frase é char[2000], que pretende que mostre com esse %i? um número? um único número a partir de um ponteiro para 2 mil letras?

Postado
12 minutos atrás, arfneto disse:

parece que não leu mesmo o tópico sobre o tal botão code...

Tinha visto mas não percebi a importância. Agora foi certo?

8 minutos atrás, arfneto disse:

Tem que SEPARAR os campos com o separador. TODOS eles. E frase é char[2000], que pretende que mostre com esse %i? um número? um único número a partir de um ponteiro para 2 mil letras?

Eu fiz modificações, tentei que imprimisse pelo menos como %s a string, tentei separar, mas nenhuma esta imprimindo o que preciso.

Não encontrei documentos que possam me ajudar nisso, estou entrando nesse mundo de programação agora, é muito informação pra absorver em pouco tempo. Já peço desculpas por não compreender bem e agradeço por estar se disponibilizando também. 

Postado
12 minutos atrás, Weverson Meireles disse:

Eu fiz modificações, tentei que imprimisse pelo menos como %s a string, tentei separar, mas nenhuma esta imprimindo o que preciso.

Não encontrei documentos que possam me ajudar nisso, estou entrando nesse mundo de programação agora, é muito informação pra absorver em pouco tempo. Já peço desculpas por não compreender bem e agradeço por estar se disponibilizando também

 

Eu te mostrei o documento, o link para o documento. E um exemplo completo, ida e volta do que tem que fazer. Apenas leia a linha e separe os campos. o numero, outro numero, o nome, a data e o resto. 

 

Se você colocar o delimitador no fim pense no que vai acontecer....

 

Ele vai ficar no fim. Não vai delimitar nada. Veja o exemplo que te mostrei com seus próprios dados.

Postado
15 minutos atrás, arfneto disse:

o numero, outro numero, o nome, a data e o resto

Eu poderia tentar gravar estes em vetores e delimitando tamanho (O que acredito que tenho conhecimento para iniciar mas não sei se daria certo), Ou deveria ler linha por linha e usando CRLF para dar quebra de linha?

Como no link que me enviou? 

Postado

@Weverson Meireles Não são vetores. Veja o exemplo que te mostrei. Veja em uma planilha. Leia o documento.

 

Leu isso:

 

image.png.70f109b6082a51fb8205f6746028c584.png

É só isso.

 

58 minutos atrás, Weverson Meireles disse:
fgets(frase, 2000, arquivo)

 

Não foi assim que você leu? Basta colocar os delimitadores.

 

22 minutos atrás, Weverson Meireles disse:

em vetores e delimitando tamanho

 

não há delimitador de tamanho. A vírgula apenas separa os campos. Veja o exemplo

 

23 minutos atrás, Weverson Meireles disse:

Ou deveria ler linha por linha e usando CRLF para dar quebra de linha?

 

já está lendo linha por linha.

 

Você tem um livro? Seu curso adota um? Qual o livro-texto?

 

24 minutos atrás, Weverson Meireles disse:

Como no link que me enviou? 

 

Que link? do IETF?

 

Postei nesse forum no passado vários programas sobre isso de csv, mas acho que sempre para ler e não para gravar.

Postado
17 horas atrás, arfneto disse:

Você tem um livro? Seu curso adota um? Qual o livro-texto?

Somente slides, sem informações sobre CSV. 

 

A ideia que tive e não estava sabendo explicar é a seguinte:

Mas também não funciona

const int TAM = 130;
int mat[TAM][TAM];
char delimitador = ',';

    for (int i=0; i<TAM; i++) {
        for (int j=0;j<TAM;j++) {
            mat[i][j] = rand();
            fprintf(arquivo, "%s%c", mat[i][j], delimitador);
        }
        fprintf(arquivo, "\n");
    }
    fclose(arquivo);
   
    

 

Postado
19 minutos atrás, Weverson Meireles disse:

Somente slides, sem informações sobre CSV

Tudo que precisa sobre  CSV eu te mostrei: os exemplos, a planilha, o documento oficial.

 

for (int i=0; i<TAM; i++) {
        for (int j=0;j<TAM;j++) {
            mat[i][j] = rand();
            fprintf(arquivo, "%s%c", mat[i][j], delimitador);
        }

 

Então você está preenchendo uma matriz de inteiros com números aleatórios positivos, quando na verdade precisa ler um arquivo texto com linhas e separar as linhas em 5 campos usando vírgulas, e já tinha um programa que lia o arquivo?

 

Qual sua ideia nesse caso?

Postado
1 minuto atrás, arfneto disse:

Qual sua ideia nesse caso?

Pegar esse programa que lê números aleatórios e passar a ler o meu arquivo incrementando as virgulas. Quero aproveitar esse código, mas não está entrando na minha cabeça como fazer 

Postado
26 minutos atrás, Weverson Meireles disse:

Pegar esse programa que lê números aleatórios e passar a ler o meu arquivo incrementando as virgulas. Quero aproveitar esse código, mas não está entrando na minha cabeça como fazer 

Não existe a menor relação entre esse programa e o seu exercício, então vai ter mesmo uma grande dificuldade.

 

Tudo que você precisa fazer é o que eu te expliquei, com exemplos

 

image.png.ae41086d389e9d41b8d7c4f7c7e67293.png

 

 

Só isso. Para todas as linhas que está lendo em frase em seu código original

 

frase é char[2000] como você declarou.

Postado
15 minutos atrás, arfneto disse:

Só isso. Para todas as linhas que está lendo em frase em seu código original

Essas ideias estão surgindo por eu não estar conseguindo montar o código para separar por virgula. Já tenho o código que lê, mas não estou conseguindo delimitar os campos. 

Postado
18 minutos atrás, Weverson Meireles disse:

Já tenho o código que lê, mas não estou conseguindo delimitar os campos

 

Não vi o que fez nesse sentido a não ser colocar uma vírgula no fim.

 

Já te mostrei várias vezes exemplos. É só isso. Olhando para os exemplos parece que tem um número, depois outro n'mero, o nome e uma data que começa por.... um número. E depois da data uma única letra.

 

Mais uma vez vou lembrar do char[2000] que está usando para ler as linhas. Se você for lá e procurar pelo primeiro espaço, pelo segundo espaço, pelo primeiro número e pela primeira letra... Terá encontrado os pontos onde colocar as quatro vírgulas, como no exemplo que te mostrei já várias vezes

 

Postado
int main (void){
FILE *arq = fopen("ARQ01.txt", "r");

	const int TAM = 21;
int mat[TAM][TAM];
char delimitador = ';'; 

	for (int i=0; i<TAM; i++) {
		char linha[200];
		fgets(linha, 200, arq);
		puts(linha);
		
		int tam=strlen(linha);
		int posVet=0;
		int conta=0;
		char palavra[30]; 
		for(int j=0;j<tam;j++) {
			if (linha[j] == delimitador) {
				char palavraAux[conta];
				strncpy(palavraAux, palavra, conta);
				
				mat[i][posVet] = atoi(palavraAux);
				
				posVet++;
				conta=0;
				continue;
			}
			palavra[conta] = linha[j];
			conta++;
		}
		
		printf("\n%i", feof(arq));
	}
	printf("\n%i", feof(arq));

	FILE *arquivo = fopen("ARQ01.txt", "w");
	for (int i=0; i<TAM; i++) {
		for (int j=0;j<TAM;j++) {
			fprintf(arquivo, "%i%c", mat[i][j], delimitador);
		}
		fprintf(arquivo, "\n");
}
	fclose(arq);
}

Outro código que tentei  

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...