gpt4 book ai didi

c - 我的简单列表仅打印 .txt 文件的最后一个元素

转载 作者:行者123 更新时间:2023-11-30 16:39:14 25 4
gpt4 key购买 nike

我有这个代码来打印 .txt 文件的内容,其中包括未知数量产品的描述、代号、日期和价格(这是因为它应该适用于任何 .txt 文件)。问题是我的程序只打印 .txt 文件的最后一个产品。我不知道为什么会这样。提前致谢!

这是程序:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LDES 32
#define LCOD 16

struct fecha { int d, m, a; };
struct ventas {
char descripcion[LDES];
char codigo[LCOD];
struct fecha ultRep;
float venta;
};
struct nodo {
struct ventas d;
struct nodo *sig;
};
nodo*primero = NULL;
nodo*ultimo = NULL;

void leerTexto(void) {
nodo*nuevo = (nodo*)malloc(sizeof(nodo));
char desc[LDES];
char cod[LCOD];
FILE *pf = fopen("ventas.txt", "r");
if (pf) {
fgets(desc, LDES, pf);
while (!feof(pf)) {
strcpy(nuevo->d.descripcion, desc);
fgets(cod, LCOD, pf);
strcpy(nuevo->d.codigo, cod);
fscanf(pf, "%d/%d/%d", &nuevo->d.ultRep.d, &nuevo->d.ultRep.m, &nuevo->d.ultRep.a);
fgetc(pf);
fscanf(pf, "%f", &nuevo->d.venta);
fgetc(pf);
if (primero == NULL) {
primero = nuevo;
primero->sig = NULL;
ultimo = nuevo;
}
else {
ultimo->sig = nuevo;
nuevo->sig = NULL;
ultimo = nuevo;
}
fgets(desc, LDES, pf);
}
fclose(pf);
}
}

void mostrarLista(void) {
nodo* actual = (nodo*)malloc(sizeof(ventas));
actual = primero;
if (primero != NULL) {
while (actual != NULL) {
printf("%s\n", actual->d.descripcion);
printf("%s\n", actual->d.codigo);
printf("%d/%d/%d\n", actual->d.ultRep.d, actual->d.ultRep.m, actual->d.ultRep.a);
printf("%f\n", actual->d.venta);
actual = actual->sig;
}
}
}

int main(void) {
leerTexto();
mostrarLista();
return 0;
}

这是 .txt 文件:

Pizza

124g284j2

10/02/19

230.93

Hamburger

27842yh28

23/09/23

197.00

Carrot

283u1j23

31/12/17

89.98

Ice Cream

3613y23u2

12/11/34

234.98

最佳答案

在您的 C++ 程序中,您必须将节点分配放在 while 循环内。 fgets(desc, LDES, pf) 也应该位于 while 循环内。

您的文件名可能具有 *.cpp 扩展名,您正在用 C++ 进行编译。您必须将文件扩展名更改为*.c,或者您可以设置编译器选项以使用C编译器。

C 中正确的声明是:

struct nodo* nuevo = malloc(sizeof(struct nodo));

您可以按照输入文件中出现的顺序放置 fgets 调用。使用 fscanf(pf, "%f\n"... 读取最后一个字符。示例:

if(pf) 
{
while(fgets(desc, LDES, pf))
{
struct nodo* nuevo = malloc(sizeof(struct nodo));
strcpy(nuevo->d.descripcion, desc);
fgets(nuevo->d.codigo, LCOD, pf);
fscanf(pf, "%d/%d/%d\n",
&nuevo->d.ultRep.d, &nuevo->d.ultRep.m, &nuevo->d.ultRep.a);
fscanf(pf, "%f\n", &nuevo->d.venta);
if(primero == NULL)
{
primero = nuevo;
primero->sig = NULL;
ultimo = nuevo;
}
else
{
ultimo->sig = nuevo;
nuevo->sig = NULL;
ultimo = nuevo;
}
}
fclose(pf);
}

您还可以为fscanf添加错误检查。如果fscanf成功,它将返回它读取的项目数。示例

if(3 != fscanf(pf, "%d/%d/%d\n",
&temp.ultRep.d, &temp.ultRep.m, &temp.ultRep.a))
break;

您在 mostrarLista 中为 node 进行了不必要的分配。它为 actual 分配内存,但在下一行 actual 被设置为 primero 现在出现了内存泄漏,没有办法释放内存来自 malloc。您只需要

void mostrarLista(void) 
{
struct nodo* actual = primero;
while(actual != NULL)
{
printf("%s", actual->d.descripcion);
printf("%s", actual->d.codigo);
printf("%d/%d/%d\n", actual->d.ultRep.d, actual->d.ultRep.m, actual->d.ultRep.a);
printf("%f\n\n", actual->d.venta);
actual = actual->sig;
}
}

关于c - 我的简单列表仅打印 .txt 文件的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127818/

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