Reaprendiendo C

Kr4n3oK

Hola compis, estoy en un proceso de reaprender C y no por necesidad si no por gusto, porque es un lenguaje que me gusta y me trae buenos recuerdos.

Estoy intentando volcar un csv a una matriz pero no lo consigo, ¿podríais echarme una mano?. Tras leer y releer no consigo hacerlo y creo que algo estoy pasandolo por lo alto.

       char row[200];
       char *data[totalRows][totalColumns];
       char *line;
       char  *token;

int i = 0;
int j = 0;
while (!feof(file)) {
	line = fgets(row, MAXCHAR, file);
	token = strtok(line, ",");
    do {
		data[i][j] = token;
		j++;
	} while (token = strtok(NULL, ","));			
    i++;
    j = 0;
}

He estado usando strcpy() pero no sé porque me mete valores extraños en el array. No sé, he probado mil cosas y no termino de conseguirlo, me hace cosas raras xd.

Gracias y saludos.

adriancin

Podría ser que token sea una referencia y se modifique en la siguiente pasada del while. Deberías de guardar en la matriz una copia del valor de token, buscando en google he visto que en c podrías hacerlo con strdup pero tampoco te fíes mucho que hace mil que no lo toco.

shaba

Amigo, en 2024 copias y pegas en chatgpt le preguntas que esta mal. Solved

1 respuesta
Kr4n3oK

#3 Ostia, pues no había caído. De todos modos chatgpt suele dar cosas mal por la experiencia que tengo xd.

1 respuesta
K

#4 cambia ChatGPT por GitHub Copilot

crb2222

¡Hola! Claro que puedo ayudarte a ajustar tu código para leer un archivo CSV y almacenarlo en una matriz en C. Primero, vamos a revisar y hacer algunas mejoras a tu fragmento de código. Hay un par de cosas a considerar para asegurarnos de que funciona correctamente.

Problemas y Mejoras:

  1. Verificación de fgets y strtok: Debes verificar si fgets y strtok devuelven NULL, lo cual puede ocurrir si se alcanza el final del archivo o si hay una línea vacía.
  2. Uso de feof(): No es recomendable usar feof() como condición de bucle para leer archivos porque solo devuelve verdadero después de intentar leer más allá del final del archivo. Esto puede resultar en que la última línea se procese dos veces.
  3. Inicialización y Límite de i y j: Debes asegurarte de que i y j no superen los límites de totalRows y totalColumns.
  4. Memoria para los tokens: Si deseas conservar los datos fuera del ámbito del bucle while, necesitarás copiar cada token en un nuevo espacio de memoria, ya que strtok devuelve un puntero al buffer original que se sobrescribe en cada llamada a fgets.

Código Mejorado:

A continuación te presento una versión revisada de tu código que trata estos problemas:

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

#define MAXCHAR 200
#define totalRows 100  // Ajusta a tus necesidades
#define totalColumns 10 // Ajusta a tus necesidades

int main() {
    FILE *file = fopen("tu_archivo.csv", "r");
    if (!file) {
        printf("Error abriendo el archivo.\n");
        return 1;
    }

    char row[MAXCHAR];
    char *data[totalRows][totalColumns];
    int i = 0;
    int j = 0;

    while (fgets(row, MAXCHAR, file)) {
        j = 0;
        char *token = strtok(row, ",");
        while (token != NULL && j < totalColumns) {
            data[i][j] = strdup(token);  // Copia el token a un nuevo espacio de memoria
            token = strtok(NULL, ",");
            j++;
        }
        i++;
        if (i >= totalRows) break;  // Evita exceder el número de filas
    }

    fclose(file);

    // Imprimir la matriz para verificar
    for (int m = 0; m < i; m++) {
        for (int n = 0; n < totalColumns; n++) {
            printf("%s ", data[m][n]);
        }
        printf("\n");
    }

    // Limpieza de memoria
    for (int m = 0; m < i; m++) {
        for (int n = 0; n < totalColumns; n++) {
            free(data[m][n]);
        }
    }

    return 0;
}

Explicación:

  • fgets() lee una línea del archivo.
  • strtok() divide la línea en tokens según las comas.
  • strdup() se usa para duplicar cada token en un nuevo bloque de memoria. Es necesario incluir <string.h> para strdup y <stdlib.h> para free().
  • Se agregan comprobaciones para evitar escribir fuera de los límites de la matriz y se cierra el archivo una vez terminado.

Este código te proporcionará una base sólida para manipular archivos CSV en C. Si tienes más preguntas o necesitas más ajustes, ¡aquí estoy para ayudar!

Kr4n3oK

Muchas gracias por la ayuda. Entre todos lo he conseguido xd

Usuarios habituales

  • Kr4n3oK
  • crb2222
  • kokre
  • shaba
  • adriancin