我的简单列表仅打印 .txt 文件的最后一个元素
Posted
技术标签:
【中文标题】我的简单列表仅打印 .txt 文件的最后一个元素【英文标题】:My Simple List only prints the last element of a .txt file 【发布时间】:2018-04-18 01:51:20 【问题描述】:我有这个代码来打印一个 .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 文件:
披萨
124g284j2
19 年 10 月 2 日
230.93
汉堡
27842yh28
23/09/23
197.00
胡萝卜
283u1j23
31/12/17
89.98
冰淇淋
3613y23u2
12/11/34
234.98
【问题讨论】:
阅读:Why is “while ( !feof (file) )” always wrong? 每个循环都需要分配节点。 顺便说一句,您将 C++ 编译器用作 C 编译器。 【参考方案1】:在您的 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;
【讨论】:
以上是关于我的简单列表仅打印 .txt 文件的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章
Excel Apache POI 在执行 setCellValue() 时仅打印最后一个元素