用 txt info 填充数组

Filling an array with txt info

提问人:Ricardo Roel 提问时间:7/14/2023 最后编辑:mkrieger1Ricardo Roel 更新时间:7/14/2023 访问量:40

问:

我需要用 .txt 文件中的信息填充一个数组,我得到了一些东西(是的,代码是西班牙语的,对不起,但我在大学里在拉丁国家编码),我忘记了,为什么 for 和 everyting 在 10 中的原因是因为我的 txt 存储了 10 个名字

#include <stdio.h>

void inicializarNombre (char* nombre) {
    for (int i = 0; i < 20; ++i) {
        nombre[i] = '\0';
    }
}

int main() {
    setbuf(stdout, 0);
    char *vectoristoNombres[10];
    char *vectoristoApellidos[10][20];

    FILE *nombres;
    nombres = fopen("nombres.txt" , "r");

    if(nombres == NULL) {
        perror("Error opening file");
        return(-1);
    }

    for (int i = 0; i < 10; ++i) {
        vectoristoNombres[i] = "";
    }


    for (int i = 0; i < 10; i++) {
        char caracter;
        char nombre[20];
        inicializarNombre(nombre);
        int index = 0;

        while ((caracter = fgetc(nombres)) != EOF) {
            if (caracter != '\n') {
                nombre[index] = caracter;
                index++;
            } else {
                vectoristoNombres[i] = nombre;
                break;
            }
        }
    }

    for (int i = 0; i < 10; ++i) {
        printf("%s\n", vectoristoNombres[i]);
    }

    fclose(nombres);

    return 0;
}

txt 文件是这样的:

data
secondData
yesMoreData
moreData

问题

该代码读取 .txt 文件并将数据存储在数组中,但是当我存储新的数据输入时,我遇到了一个问题,例如替换以前的数据。

当我在 for 的第二次迭代中时,数组应该vectositoNombres[]

vectositoNombres[0] = "data"
vectositoNombres[1] = "secondData"

但取而代之的是,商店:

vectositoNombres[0] = "secondData"
vectositoNombres[1] = "secondData"

我知道,我已经尝试过了

调试后,我发现当我调用数组时,数组变得空inicializarNombre()vectorsitonombres[]

在第三次迭代中应存储vectorsitoNombres[]

vectositoNombres[0] = "data"
vectositoNombres[1] = "secondData"
vectositoNombres[2] = "yesMoreData"

但它只是存储:

vectositoNombres[0] = "yesMoreData"
vectositoNombres[1] = "yesMoreData"
vectositoNombres[2] = "yesMoreData"

在调用它之后,它转为:inicializarNombre()

vectositoNombres[0] = ""
vectositoNombres[1] = ""
vectositoNombres[2] = ""
数组 C 文件 TXT

评论

1赞 Paul Lynch 7/14/2023
在第二个循环中,每个循环都设置为指向同一个缓冲区,其中包含读取的最后一行。中的所有指针值都是相同的。vectoristoNombres[i]nombrevectoristoNombres
0赞 Ricardo Roel 7/14/2023
我该如何解决这个问题?,我已经将vectorsitoNomrbes[i] = nombre移出了while,并且仍然在做同样的事情(对不起,如果我不太了解,idk 很多关于 c 中的缓冲区)
0赞 Paul Lynch 7/14/2023
每个缓冲区都必须指向不同的缓冲区(或单个较大缓冲区中的不同位置)。您可以定义为 ,将字符读入 ,并将 设置为 。但请注意,这是在第二个循环的范围内定义的,但其地址仍(重复)存储在第三个循环 (UB) 中并在第三个循环 (UB) 中使用。将 的声明移到循环之外,为其提供函数范围。vectoristoNombres[i]nombrechar nombre[10][20];nombre[i][index]vectoristoNombres[i] = nombre[i]nombrevectoristoNombresnombre
0赞 Paul Lynch 7/14/2023
而且你每次都必须通过第二个循环。如果在读取换行符时以 NUL 终止,则根本不需要初始化 ()。如果文本文件的行数超过 19 个字符,所有这些都会忽略潜在的缓冲区溢出。inicializarNombre(nombre[i]);nombre[i]nombre[i][index] = ‘\0’;
1赞 Ricardo Roel 7/14/2023
它奏效了,非常感谢。你在评论中而不是在评论中解决了它,我该如何感谢你?

答: 暂无答案