gpt4 book ai didi

c - 我将如何读取一行,解析信息,然后将其归因于 C 中的结构?

转载 作者:行者123 更新时间:2023-12-01 14:01:18 26 4
gpt4 key购买 nike

我目前正在尝试了解如何在 C 中浏览 .txt 文件,我认为我几乎已经解决了所有问题,但我需要做的有点令人困惑。我需要创建一个指针数组来指向结构。我的 .txt 文件中的每一行都应包含与单个结构相对应的信息。每行应以名称开头,后跟一些浮点值。我的问题是,当我阅读这些行并首先使用 strtok 解析它们时,我将如何在结构中获取该信息?其次,我如何使索引 i 处的样本指针指向结构?我尝试将名称与数字分开,因为数字需要它们自己的特殊 atof 转换,因为最初它将是一个字符串。但是我认为这可能是不正确的,因为我想阅读多行,我在 while 循环之前获得名称的代码只会运行一次,因此任何后续行都不会将名称分开。我可以根据自己的选择在技术上分隔我的文本文件,所以也许我可以用分号和其余空格分隔名称?如果这个问题看起来令人困惑,那可能是因为我想太多了

我是否应该声明一个结构,例如:Sample tmp;我一直在阅读示例,但不知道如何将这些信息放在一起。让我知道我是否错误地声明了我的指针数组......我想我做了。我认为我的那句话是:sample arr[SIZE] = {NULL}; 可能不正确,但我不确定。如果你能帮我弄清楚这一切背后的逻辑,我将不胜感激。谢谢。

typedef struct sample{
char* name;
int list_len;
float* value_list;
}sample;



void read_and_parse(){
const int SIZE = 1024;
sample* sample = (sample*)malloc(sizeof(sample); //pointer allocation?
FILE* fin;

fin = fopen("record.txt", "r");
if (fin == NULL) {
printf("record.txt could not be opened \n");
exit(1);
}
else {
int i= 0;
sample arr[SIZE] = {NULL}; //here I try to make the array of pointers
char linebuf[SIZE];
token = strtok(linebuf, " "); //grab the first item




while (fgets(linebuf, SIZE, fin) && i<SIZE) {
arr[i] = malloc(sizeof(sample));
arr[i.name] = token;
token = strtok(NULL, " ");



// now parse the linebuf and fill arr[i] with it

i++;
}

编辑:11/02/2017您看到的任何打印语句都只是我放置的愚蠢标记,用于测试并在我最终编译此代码时识别正在运行的内容这是经过更好编辑的代码版本。我认为它现在应该可以工作了。

typedef struct sample{
char* name;
int list_len;
float* value_list;
}sample;



void read_and_parse(FILE **fin, sample* arr[]){
const int SIZE = 1024;

if (*fin == NULL) {
printf("record.txt could not be opened \n");
exit(1);
}
else {
printf("successfully opened file\n");


char linebuf[SIZE];
while ( fgets(linebuf, SIZE, fin) ) {

arr[i] = malloc(sizeof(sample));
int floats_per_line = 0;

while(linebuf[i]){
if(linebuf[i] == ' ');
++floats_per_line;
}

arr[i]->list_len = values_per_line;
arr[i]->value_list = (float*)malloc(sizeof(float)*floats_per_line);
arr[i]->name = strdup(strtok(linebuf, ' '));
char* tok;
int j = 0
while(tok = strtok(NULL, ' ')){
arr[i]->value_list[j] = atof(tok);
++j
}

i++;
}
}
fclose(fin);
}

最佳答案

How would I read a line, parse the information and then attribute it to a struct ?

使用 fgets() 读取,它将文件输入的 转换为 字符串。 OP 做得很好。然后解析字符串。

when I read the lines and parse them using strtok first, how (to) get that information in a struct?
Should I be declaring a struct such as : sample tmp;

string 传递给辅助函数以将其解析为可以容纳任何输入的 sample。所以tmp的指针成员需要指向最大空间。

char name[SIZE];
char f[SIZE/2];
sample tmp = { name, 0, f };

while (i<SIZE && fgets(linebuf, SIZE, fin)) {
if (sample_parse(&tmp, linebuf) == NULL) {
break; // Parsing failed for some reason, perhaps an error message?
}

// Now populate arr[i] with right-sized memory allocations
arr[i].name = strdup(tmp.name); // ToDo: add NULL check
arr[i].list_len = tmp.list_len;
size_t f_size = sizeof *(tmp.value_list) * tmp.list_len;
arr[i].value_list = malloc(f_size); // ToDo: add NULL check
memcpy(arr[i].value_list, tmp.value_list, f_size);
i++;
}

so maybe I can just separate the name with a semicolon and the rest spaces?

是的。也允许其他空格。

if I declared my array of pointers incorrectly.

代码在任何地方都没有指针数组。


建议使用 size_t 作为数组大小类型。

typedef struct sample {
char* name;
// int list_len;
size_t list_len;
float* value_list;
} sample;

一些未经测试的解析代码。使用 strtok() 解析行。使用 strtof() 进一步解析数字标记。

#define sample_NAME_DELIMITER ":"
#define sample_NUMBER_DELIMITER " \n\t\r"

// parse for a name and then 0 or more numbers
static sample *sample_parse(sample *dest, char *linebuf) {
char *s = strtok(linebuf, sample_NAME_DELIMITER);
if (s == NULL) {
return NULL; // no name - TBD on if this is allowed
}
strcpy(dest->name, s);
size_t i = 0;
while ((s = strtok(NULL, sample_NUMBER_DELIMITER)) != NULL) {
char *endptr;
dest->value_list[i] = strtof(s, &endptr);
if (s == endptr || *endptr) {
// conversion failed or extra junk
break;
}
i++;
}
dest->list_len = i;
return dest;
}

关于c - 我将如何读取一行,解析信息,然后将其归因于 C 中的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com