将 csv 文件读入结构数组

2023-12-12

我开始用C编写代码。我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STR_LEN 256
#define MAX_BOOKS 256

struct book{
    int ID;
    char *name;
    char *dateIn;
    char *dateOut;
};

struct book books[MAX_BOOKS];

/* PROTOTYPE OF FUNCTIONS */
int readBookFile();
void printBookList();


int main(int argc, char **argv)
{   
    int isOK = 0;

    isOK = readBookFile();

    printBookList();

    system("pause");
    return 0;
}

int readBookFile()
{
    /* FileStream for the Library File */
    FILE *bookFile;

    /* allocation of the buffer for every line in the File */
    char *buf = malloc(MAX_STR_LEN);
    char *tmp; 

    /* if the space could not be allocaed, return an error */
    if (buf == NULL) {
        printf ("No memory\n");
        return 1;
    }

    if ( ( bookFile = fopen( "library.dat", "r" ) ) == NULL ) //Reading a file
    {
        printf( "File could not be opened.\n" );
    }

    int i = 0;
    while (fgets(buf, 255, bookFile) != NULL)
    {
        if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n'))
            buf[strlen (buf) - 1] = '\0';       

        tmp = strtok(buf, ";");
        books[i].ID = atoi(tmp);

        tmp = strtok(NULL, ";");
        books[i].name = tmp;

        tmp = strtok(NULL, ";");
        books[i].dateIn = tmp;

        tmp = strtok(NULL, ";");
        books[i].dateOut = tmp;

        //tempBook.ID = atoi(buf);
        printf("index i= %i  ID: %i, %s, %s, %s \n",i, books[i].ID , books[i].name, books[i].dateIn , books[i].dateOut);

        i++;
    }
    //free(buf);
    fclose(bookFile);
    return 0;
}

void printBookList()
{

    int i;
    //i = sizeof(books) / sizeof(books[0]);
    //printf ("%i \n", i);


    for (i = 0; i <= sizeof(books); i++)
    {
        if (books[i].ID != 0)
        printf("index i= %i  ID: %i, %s, %s, %s \n",i, books[i].ID , books[i].name, books[i].dateIn , books[i].dateOut);
        else
            break;
    }

}

问题是,在 readBookFile() 结束后,我的结构数组充满了输入文件的最后一个值。

我的输入文件是:

1;das erste Buch; 12122013; 13122013
2;das Zweite Buch; 12122013; 13122013
3;das dritte Buch; 12122013; 13122013
4;das vierte Buch; 12122013; 13122013
5;das fünfte Buch; 12122013; 13122013
6;das sechste Buch; 12122013; 13122013

因此,在 readBookFile 函数中, printf 返回正确的值,但在 printBooksList() 函数中,所有值似乎都已更改为我的输入文件的最后一行。

the output on my console

谁能向我解释这一点并也许为我指出正确的方向?

多谢 哈格巴特


问题是你的结构:

struct book{
    int ID;
    char *name;
    char *dateIn;
    char *dateOut;
};

name、dateIn、dateOut 是“指针”,它们只是指向某个东西,您没有为它们分配空间。
你所做的只是向他们指出tmp(buf).

所以你在 printBookList() 中所做的只是打印相同的字符串块,而 ID 是可以的,因为它不是指针。

要解决这个问题,请为它们分配空间,您可以使用 strdup(),但请确保释放它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 csv 文件读入结构数组 的相关文章

  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • JavaScript:预期的赋值或函数调用,却看到了一个表达式

    我正在使用 JSHint 来确保我的 JavaScript 是 严格的 但我收到以下错误 预期是赋值或函数调用 但看到的是表达式 关于以下代码 var str A B C D var data var strArr str split fo
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 在 Java 中,对 Class.class 的引用有什么作用?

    我正在构建一个小型 Android 应用程序 但这更像是一个 Java 问题 而不是 Android 问题 浏览教程 有一些行看起来像 startService new Intent this MyService class MyServi
  • 如何获取接近另一种颜色的RGB值?

    如果我有 RGB 颜色 如何创建一个 javascript 函数 当另一个 RGB 值接近初始 RGB 时返回 true 否则返回 false 我已经使用过这个并且它对我来说非常有效 assuming that color1 and col
  • 如何在Python 3中通过FTP从内存上传数据?

    我想通过 FTP 将内存中的各种数据 数组内容 静态 html 代码等 上传到网络服务器 这仅适用于一个基本字符串 Hello World from ftplib import FTP import io bio io BytesIO b
  • 移动应用程序时会重置用户设置

    我注意到 如果您将该应用程序 exe 文件移动到另一个位置 用户设置将重置 据我了解 发生这种情况是因为应用程序数据文件夹中的位置也基于 exe 的路径 在生成哈希时会考虑到这一点 我知道有不同的替代方案 可以使用注册表或手动创建自定义配置
  • 将 null 放置在列表末尾

    我需要将空对象放置在末尾List 这是我为此目的所做的示例 public static void main String args List
  • 如何显示ProgressBar并使其进度?(Xamarin.Android)

    我调用一个 Web 服务 它获取 4 个文件 在加载这些文件时 我想向用户显示进度 圆形或水平都没关系 我已按照互联网上的示例进行操作 但屏幕上没有显示任何内容 MobileSellReference Service1 service ne
  • 有没有办法分析 Chromecast 崩溃?

    显然 崩溃后 端口 9222 上的开发者工具没有任何用处 因为 远程调试已因原因终止 websocket close 例如 我如何检索记录的时间线 或获取调用堆栈 或者找到有关 Chromecast 决定自行重启的原因的任何信息 调试 Ch
  • 在 JS 中移动元素

    我正在学习 javascript 并尝试做一个简单的练习 我有一个文本框并想用键盘控制它 我的 HTML 如下 目前 我只是尝试 1 个方向 const myBox document querySelector h1 document ad
  • D3 节点半径取决于链接数量:权重属性

    我正在尝试使用 D3 创建力定向图 就目前而言 节点的半径取决于核心价值JSON 中的对 d 尺寸 我知道d3 权重属性可用于计算链接数量并关联圆的半径属性 但我不知何故无法让它工作 请在这件事上给予我帮助 找到下面的代码 d3 json
  • “合并”替换 Keras/Tensorflow/Python3

    Merge 未在 Keras Tensorflow Python3 版本上运行 在以前的版本中 合并正在运行 但现在 它没有运行 所以我想我应该用替换 合并 来转换此代码 新的 Keras Tensorflow Python3 版本中缺少
  • 给定一个数组,找出每个元素的下一个较小元素

    给定一个数组 在不改变元素原始顺序的情况下 为每个元素找到数组中下一个较小的元素 例如 假设给定数组为 4 2 1 5 3 结果数组将为 2 1 1 3 1 我在一次采访中被问到这个问题 但我想不出比简单的 O n 2 解决方案更好的解决方
  • SQLite是否支持“删除自”

    这是 Microsoft SQL Server 的 T SQL 上的有效语法 但在 SQLite 中无效 是否有在 SQLite 中执行相同操作的替代语法 DELETE FROM something FROM something INNER
  • HTML元素的id属性在整个页面中必须是唯一的吗?

    我正在使用 jQuery 我只是想知道 ID 在整个页面中是否必须始终是唯一的 我知道课程可以重复多次 那么 ID 呢 是的 它必须是独一无二的 HTML4 https www w3 org TR html4 struct global h
  • 如果循环正在运行,wifi.sta 模块会连接吗?

    我试图检测模块何时实际连接到我的 wifi AP 因为 connect 没有回调 我做了如下简单的事情 wifi sta config SSID password wifi sta connect tmr delay 1000000 i 0
  • 在 es6 中添加行而不推送反应状态

    我不确定我做的是正确的事情 我在 setState 之外改变变量 这很好 对吧 或者有更优雅的方法来做到这一点 state persons name jay age 10 addRow gt const temp this state te
  • 对 asp-route-parameter 使用隐藏字段值

    我在 PartialView 中有一个隐藏字段 其中包含我想要的值 jQuery 填充它 我需要在 foreach asp route parameter 中使用相同的值 div class js products list div
  • 通过Id查询Morphia

    我正在使用 Morphia MongoDB 的 Pojo 映射器 我发现一项在我看来应该非常简单的任务很困难 通过 id 获取对象 我能够找到集合中的所有对象 但无法弄清楚使用从列表中获得的 id 进行查询的简单任务 我实际上是在谈论 Ob
  • 如何保护PHP中的配置文件?

    我正在开发一个 PHP 项目 为其他程序员开发模板引擎 这个想法很简单 将有一个包含模板的模板文件夹和一个包含页面的页面文件夹 php 获取模板并使用当前 url 将页面插入其中 几年前我在没有面向对象的情况下完成了这个项目 但现在我正在尝
  • InvalidOperationException:类型“System.Linq.Queryable”上的方法“Where”与提供的参数不兼容

    下面的代码已更新并且可以正常工作 LinqPad 有动态 OrderBy 示例 我想做的只是简单地对此示例应用 Where 而不是 OrderBy 这是我的代码 IQueryable query from p in Purchases wh
  • 将 csv 文件读入结构数组

    我开始用C编写代码 我的代码如下 include