我的简单列表仅打印 .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() 时仅打印最后一个元素

发送多个文件功能仅发送列表中的最后一个文件并忽略其他文件

每个打印页面上的最后一个元素的样式不同

R:将列表打印到文本文件

从listView中删除项目仅删除最后一项未选择的元素android

动态数组分配仅返回所有索引中的最后一个元素 C