2
respostas

[Dúvida] struct com arquivo

Estou montando um programa onde devo armazenar matrizes em um arquivo, onde o usuario pode acessar para fazer a leitura ou adicionar mais matrizes, só que não estou sabendo como armazenar em structs, por isso gostaria de saber como salvo uma struct em um arquivo.

2 respostas

Oi Daniely, tudo bem?

Para salvar uma struct em um arquivo em C ou C++, você pode seguir alguns passos básicos. Vou fornecer um exemplo simples usando C++, onde a struct representa uma matriz. Neste exemplo, estou assumindo que a matriz é bidimensional e que você está usando uma versão do C++ que suporta C++11 ou posterior.

#include <iostream>
#include <fstream>

// Definição da struct para representar uma matriz
struct Matriz {
    int linhas;
    int colunas;
    int** elementos; // ou você pode usar std::vector<std::vector<int>> elementos; para facilitar a gestão de memória
};

// Função para salvar uma struct Matriz em um arquivo
void salvarMatriz(const Matriz& matriz, const char* nomeArquivo) {
    std::ofstream arquivo(nomeArquivo, std::ios::binary);

    if (!arquivo) {
        std::cerr << "Erro ao abrir o arquivo para escrita." << std::endl;
        return;
    }

    // Escrever os dados da struct no arquivo
    arquivo.write(reinterpret_cast<const char*>(&matriz), sizeof(Matriz));

    // Fechar o arquivo
    arquivo.close();
}

// Função para carregar uma struct Matriz de um arquivo
Matriz carregarMatriz(const char* nomeArquivo) {
    Matriz matriz;

    std::ifstream arquivo(nomeArquivo, std::ios::binary);

    if (!arquivo) {
        std::cerr << "Erro ao abrir o arquivo para leitura." << std::endl;
        // Você pode lidar com o erro de outras maneiras, como lançar uma exceção
        // ou retornar uma matriz vazia, dependendo dos requisitos do seu programa.
    }

    // Ler os dados da struct do arquivo
    arquivo.read(reinterpret_cast<char*>(&matriz), sizeof(Matriz));

    // Fechar o arquivo
    arquivo.close();

    return matriz;
}

int main() {
    // Exemplo de uso
    Matriz minhaMatriz;
    minhaMatriz.linhas = 3;
    minhaMatriz.colunas = 3;
    minhaMatriz.elementos = new int*[minhaMatriz.linhas];
    for (int i = 0; i < minhaMatriz.linhas; ++i) {
        minhaMatriz.elementos[i] = new int[minhaMatriz.colunas];
        for (int j = 0; j < minhaMatriz.colunas; ++j) {
            minhaMatriz.elementos[i][j] = i * minhaMatriz.colunas + j;
        }
    }

    // Salvar a matriz em um arquivo
    salvarMatriz(minhaMatriz, "matriz.bin");

    // Carregar a matriz de volta do arquivo
    Matriz matrizCarregada = carregarMatriz("matriz.bin");

    // Imprimir a matriz carregada (apenas para verificar)
    for (int i = 0; i < matrizCarregada.linhas; ++i) {
        for (int j = 0; j < matrizCarregada.colunas; ++j) {
            std::cout << matrizCarregada.elementos[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // Lembre-se de liberar a memória alocada para a matriz
    for (int i = 0; i < minhaMatriz.linhas; ++i) {
        delete[] minhaMatriz.elementos[i];
    }
    delete[] minhaMatriz.elementos;

    return 0;
}

Neste exemplo:

  1. A função salvarMatriz escreve a struct Matriz no arquivo em formato binário.
  2. A função carregarMatriz lê a struct Matriz do arquivo.

Certifique-se de adaptar o código conforme necessário para atender aos requisitos específicos do seu programa. Além disso, ao trabalhar com arquivos binários, esteja ciente de questões como portabilidade, tamanhos de dados e endianess, dependendo dos sistemas em que o código será executado.

so estou programando em c, mas gostaria de saber como passo esse arquivo binario para arquivo normal, pq no item 2 ele pede para ler um sistema do blocos de notas.

#include <stdio.h> //função de entrada e saida #include <stdlib.h> //função que envolve alocação de memoria #include <time.h> //função de manipulação de unidade de tempo #include <locale.h> //define o idioma para a localidade padrao do sistema #include <string.h> //funcao que manipula strings

#define MAX_ORDER 10

const int ERRO_NENHUM = 0;

typedef struct{ int ordem; int posto; float A[MAX_ORDER][MAX_ORDER]; float x[MAX_ORDER]; float y[MAX_ORDER]; }Sistema;

int main(){

setlocale(LC_ALL,"");

int EOF_ctrl; //controle para n ler algo duplicado
int i, j, k, n = ORDEM_MATRIZ, escolha, aux;
float c, soma = 0.0, x[10];

Sistema sistema;

FILE *arquivo;

while(escolha != 6){
    
    puts("------------ Cálculo de um sistema linear -------------- \n");
    puts("1 - Inserir manualmente o sistema.");
    puts("2 - Carregar um sistema de um arquivo texto.");
    puts("3 - Determinar a solução do problema.");
    puts("4 - Exibir um sistema.");
    puts("5 - Ordenar sistemas.");
    puts("6 - Sair do programa.");
    puts("-------------------------------------------------------- \n");

    printf("Digite o número desejado: ");
    scanf("%d", &escolha);
    
    printf("\n");
    
    switch(escolha){
        case 1:{
            
            printf("\n\n******************* Coleta de Dados ********************* \n\n");
            
            char nome_arquivo[100];
            printf("Qual o nome do arquivo? ");
            scanf("%s", nome_arquivo);
            strcat(nome_arquivo, ".txt");
            
            printf("Qual a ordem da matriz? ");
            scanf("%d", &sistema.ordem);
            
            arquivo = fopen(nome_arquivo, "a+b");

            if(arquivo == NULL){
                printf("Problemas na abertura do arquivo!");
            }else{
                printf("Arquivo criado com sucesso!\n");
            }

            for(i = 1; i <= sistema.ordem; i++){
                for(j = 1; j <= sistema.ordem + 1; j++){
                    printf("\nElemento[%d][%d] = ", i, j);
                    scanf("%f", &sistema.A[i][j]);
                }
            }
            
            fwrite(&sistema, sizeof(Sistema), 1, arquivo);
            
            if(ferror(arquivo)){
                printf("\nErro na gravacao\n");
            }else{
                printf("\ngravacao ok");
            }
            
            if(!fclose(arquivo)){
                printf("FECHAR: sucesso no fechamento");
            }else{
                printf("FECHAR: ERRO NO FECHAMENTO");
            }
            
            
            printf("\n\n******************* Saida de Dados ********************* \n\n");
            
            for(i = 1; i <= sistema.ordem; i++){
                for(j = 1; j <= sistema.ordem +  1; j++){
                    printf ("\nElemento[%d][%d] = %.2f\n", i, j, sistema.A[ i ][ j ]);
                }
            }
            
            printf("\n\n******************* Forma matricial do sistema  ********************* \n\n");
            
            for(i = 1; i <= sistema.ordem; i++){
                for(j = 1, aux = 1; j <= sistema.ordem +  1, aux < sistema.ordem +  1; j++, aux++){
                    printf ("%.2fX%d\t", sistema.A[ i ][ j ], aux);	
                }
                printf ("= %.2f\t", sistema.A[ i ][ j ]);
                printf ("\n");
            }
            printf ("\n");
            
            break;
        }
        case 2:{
            char nome_arquivo[100];
            printf("Qual o nome do arquivo? ");
            scanf("%s", nome_arquivo);
            strcat(nome_arquivo, ".txt");
            
            arquivo = fopen(nome_arquivo, "a+b");

            if(arquivo == NULL){
                printf("Problemas na abertura do arquivo!");
            }else{
                printf("Arquivo lido com sucesso!\n\n");
                while(!feof(arquivo)){
                    EOF_ctrl = fread(&sistema, sizeof(Sistema), 1, arquivo);
                    
                    if(ferror(arquivo)){
                        printf("\nERRO na leitura do arquivo");
                    }else{
                        if(EOF_ctrl != 0){
                            printf("Ordem: %d\n", sistema.ordem);
                            printf ("\n");
                            printf("Posto: %d\n", sistema.posto);
                            printf ("\n");
                            printf("Matriz: ");
                            for(i = 1; i <= sistema.ordem; i++){
                                for(j = 1; j <= sistema.ordem +  1; j++){
                                    printf ("%.2f\t", sistema.A[ i ][ j ]);	
                                }
                                printf ("\n");
                                printf ("\t");
                            }
                            printf ("\n");
                            printf("X: ");
                            for(i = 1; i <= sistema.ordem; i++){
                                printf("%.2f\n", sistema.x[ i ]);
                            }
                            printf ("\n");
                            printf("Y: ");
                            for(i = 1; i <= sistema.ordem; i++){
                                sistema.y[i] = sistema.A[i][sistema.ordem + 1];
                                printf ("%.2f\n", sistema.y[i]);	
                            }
                            
                        }
                    }
                }
                printf("Fim do arquivo!\n");
            }
            
            break;
        }
        case 3:{
            char nome_arquivo[100];
            arquivo = fopen(nome_arquivo, "a+b");

            if(arquivo == NULL){
                printf("Problemas na abertura do arquivo!");
            }else{
                printf("Arquivo criado com sucesso!\n");
            }
            
            //Zerando a parte de baixo, tornando uma matriz triangular superior
            for(j = 1; j <= sistema.ordem; j++){
                for(i = 1; i <= sistema.ordem; i++){