【问题标题】:Reading a textfile line by line in C在C中逐行读取文本文件
【发布时间】:2018-01-24 22:38:36
【问题描述】:

我需要能够从文本文件中获取数据,该文件格式如下:

起始现金:1500
转弯限制(-1 表示无转弯限制):10
结束游戏的玩家人数:1
属性集乘数:2
酒店之前的房屋数量:4
必须均匀地建造房屋:是
将钱存入免费停车位:否
拍卖属性:无
着陆时的工资乘数:1

为了澄清,我需要冒号后面的数据。我不确定如何处理这个问题。我正在阅读其他问题,他们都说要使用fgets,但我不知道每行会有多长,我们不能静态分配C字符串,所以我将fgets指向的行存储在哪里?另外,是否可以使用fscanf 来做到这一点(我们已经学会了如何做fscanf,但没有学会fgets)?我在处理这个问题时的想法是获取每一行,然后使用我不需要的字符串文字用 sscanf 扫描每一行(我认为这会起作用):

sscanf(str, "Starting Cash: %d", &startingCash);

这行得通吗?

【问题讨论】:

  • 可以使用strchr来定位冒号在行中的位置。或者你可以使用strtok来解析行
  • “我们不能静态分配 C 字符串”。简单的方法是定义一个足够大的本地数组来保存您期望的最长输入。使用fgets 并根据需要限制输入长度。
  • “我需要冒号后面的数据。” 能保证数据按照相同的顺序呈现吗?
  • 或者简单地使用面向字符的输入,比如fgetc,检查':',然后检查'\n'(中间的东西,减去任何前导或尾随空格,是你想要什么)

标签: c file scanf fgets


【解决方案1】:

fopen()打开文件后,你可以这样做

float cash;
int turnlimit, plyrno, mult, house;
fscanf(fin, "%*[^:]: %f", &cash);
fscanf(fin, "%*[^:]: %d", &turnlimit);
fscanf(fin, "%*[^:]: %d", &plyrno);

其中finFILE 指针。

%[^:] 将扫描直到但不包括遇到: 并且* 用于分配抑制;这意味着它的值将被读取但不会分配到任何地方。

在读取到: 之前的点之后,必须读取: 本身后跟一个空格。所以: 必须在格式字符串中,后跟一个空格。

What is the purpose of using the [^ notation in scanf?

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2020-09-11
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2010-12-24
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多