- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个txt文件,它的行如下
[7 chars string][whitespace][5 chars string][whitespace][integer]
我想使用 fscanf() 将所有这些读入内存,但我对应该使用什么格式感到困惑。
下面是这样一行的例子:
hello box 94324
注意每个字符串中的填充空格,除了分隔空格。
编辑:我知道首先使用 fgets() 的建议,我不能在这里使用它。
编辑:这是我的代码
typedef struct Product {
char* id; //Product ID number. This is the key of the search tree.
char* productName; //Name of the product.
int currentQuantity; //How many items are there in stock, currently.
} Product;
int main()
{
FILE *initial_inventory_file = NULL;
Product product = { NULL, NULL, 0 };
//open file
initial_inventory_file = fopen(INITIAL_INVENTORY_FILE_NAME, "r");
product.id = malloc(sizeof(char) * 10); //- Product ID: 9 digits exactly. (10 for null character)
product.productName = malloc(sizeof(char) * 11); //- Product name: 10 chars exactly.
//go through each line in inital inventory
while (fscanf(initial_inventory_file, "%9c %10c %i", product.id, product.productName, &product.currentQuantity) != EOF)
{
printf("%9c %10c %i\n", product.id, product.productName, product.currentQuantity);
}
//cleanup...
...
}
这是一个文件示例:(实际上是 10 个字符、9 个字符和 int)
022456789 box-large 1234
023356789 cart-small 1234
023456789 box 1234
985477321 dog food 2
987644421 cat food 5555
987654320 snaks 4444
987654321 crate 9999
987654322 pillows 44
最佳答案
假设您的输入文件格式正确,这是最直接的版本:
char str1[8] = {0};
char str2[6] = {0};
int val;
...
int result = fscanf( input, "%7s %5s %d", str1, str2, &val );
如果 result
等于 3,则您成功读取了所有三个输入。如果它小于 3 但不是 EOF
,那么您的一个或多个输入有匹配失败。如果是EOF
,则说明您已经到达文件末尾或存在输入错误;使用 feof( input )
测试此时的 EOF。
如果您不能保证您的输入文件格式正确(我们大多数人做不到),您最好将整行作为文本阅读并自己解析。你说你不能使用 fgets
,但是有一种方法可以使用 fscanf
:
char buffer[128]; // or whatever size you think would be appropriate to read a line at a time
/**
* " %127[^\n]" tells scanf to skip over leading whitespace, then read
* up to 127 characters or until it sees a newline character, whichever
* comes first; the newline character is left in the input stream.
*/
if ( fscanf( input, " %127[^\n]", buffer ) == 1 )
{
// process buffer
}
然后您可以使用 sscanf
解析输入缓冲区:
int result = sscanf( buffer, "%7s %5s %d", str1, str2, &val );
if ( result == 3 )
{
// process inputs
}
else
{
// handle input error
}
或通过其他方法。
编辑
需要注意的边缘情况:
int
中编辑 2
我们大多数人不推荐 fscanf
的原因是它有时会使错误检测和恢复变得困难。例如,假设您有输入记录
foo bar 123r4
blurga blah 5678
然后您使用 fscanf( input, "%7s %5s %d", str1, str2, &val );
读取它。 fscanf
将读取 123
并将其分配给 val
,将 r4
留在输入流中。在下一次调用时,r4
将被分配给 str1
,blurga
将被分配给 str2
,而您将在 blah
上得到匹配失败。理想情况下,您希望拒绝整个第一个记录,但当您知道存在问题时为时已晚。
如果你首先把它读成一个字符串,你可以解析和检查每个字段,如果其中任何一个是坏的,你可以拒绝整个东西。
关于c - 以空格作为分隔符的 fscanf - 我应该使用什么格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853055/
使用 ListView.separated 我们可以在列表项之间添加 Divider(),但是,一旦我转换到 SliverList,我就看不到我的分隔线了。 delegate: SliverChild
使用 ListView.separated 我们可以在列表项之间添加 Divider(),但是,一旦我转换到 SliverList,我就看不到我的分隔线了。 delegate: SliverChild
我对 Angular 还很陌生。我有一个由一些数据填充的列表项: {{content.Company}} {{content.Town}}, {{content.P
我正在尝试从 SwiftUI 中的 List 中删除“行”分隔符(在 SwiftUI 中称为分隔符)。 我浏览了 List 文档,但我没能找到它的修饰符。 如有任何帮助,我们将不胜感激。 最佳答案 i
我有一个带有 4 个按钮的网格...1 行 4 列。我正在寻找一种方法将左侧的两个按钮与右侧的两个按钮进行视觉分组。我一直在寻找一种使用分隔符执行此操作的方法,但它似乎与 Grid 一起玩得不好,更喜
我对 R 语言相当陌生。所以我有这个包含以下内容的向量: > head(sampleVector) [1] "| txt01 | 100 | 200 | 123.456
我正在尝试连接两列中的值,当我使用 =CONCAT(A2,",",B2) 时,它将连接两列并获得正确的结果 (P0810,P1)。但我正在寻找的是这样的东西(“P0810”,“P1”)。我尝试了 =C
我在这里创建了一个简单的演示。在 amount 字段编辑时,我想显示 , 分隔符?目前,它仅在不处于编辑模式时显示 ,。知道如何实现这一目标吗? DEMO IN DOJO var data = [{
这里是java菜鸟... 这让我抓狂,因为我知道这很简单,但我已经为此工作了 30 分钟...... 这是来自代码战斗: 对于参数 = ["Code", "Fight", "On", "!"] 且分隔
基于这个pywin32基础script如何向托盘菜单 menu_options 添加分隔符? 我还可以让菜单在左键单击时弹出,而不仅仅是右键单击吗? 最佳答案 将 notify 函数(从 URL 中的
我正在使用这段代码: StringTokenizer tokenizer=new StringTokenizer(line, "::"); 拆分以下字符串: hi my name is visghal
- Dropbox login fix - Updated iris viewer * other aspects are to be improved + fix crash on viewing
我试图在每个菜单组之间显示一个分隔线。我已经尝试过为每个组提供一个唯一的 ID,但这没有用。我找到了一些其他解决方案,但它们看起来有点奇怪,比如创建高度为 1dp 的 LinearLayout。 这是
我想为 CONCAT_WS() 选择一个与字段值不冲突的分隔符例如,如果我选择“,”,则字段值可能包含带有“,”的字符串我想选择一个与字段值不冲突的分隔符:( 最佳答案 来自here : CONCAT
我想知道 Sphinx 引擎是否可以使用任何定界符(如普通 MySQL 中的逗号和句点)。我的问题来自于一种冲动,根本不使用它们,而是逃避它们,或者至少在使用 FULLTEXT 搜索执行 MATCH
我正在尝试使用 svg 或纯 css3 制作 header 分隔符,如下所示: preview from design 在 header 中我有标准的 bootstrap 4 轮播
我在使用 CSS 分隔符时遇到了一些难题。看看:http://jsfiddle.net/fVxC6/1/ .div-line { border-bottom: 1px solid #f0f0f
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 7 年前。 编辑问题以包含 desired behavior, a specific probl
嘿,我正在尝试使用 getline 读取以下行 (15,0,1,#) (2,11,2,.) (3,20,0,S) 我希望能够将整数提取为 int,将字符提取为 char,但我不知道如何只提取它们。 最
我有 2 列,每边 float 一列,我想使用 1px 宽度的线分隔符,从最长列的顶部到底部。 我宁愿远离 TABLE 布局,而且我不知道哪一个将是最长的列,或者它会有多长。 我怎么能只用 css 做
我是一名优秀的程序员,十分优秀!