如何从txt文件读取逗号分隔的数据到结构
How to read comma delimited data from txt file to struct
我有包含以下内容的文本文件
inputfile
我使用函数从逗号分隔的输入文件中获取数据。
我想从中读取数据并删除逗号并将数据存储到 Struct Resistor_struct。
我试过下面的代码。
'''
#include<stdio.h>
//functions header
int blown_ressistors();
struct resistor_struct
{
char ID_LEN[5];
char id;
float max_poewr;
int resistance;
};
struct resistor_struct rs[100];
int blown_ressistors()
{
FILE *fp = fopen("input.txt", "r");
int i = 0;
if(fp!=NULL)
{
while(fscanf(fp, "%s[^,], %d[^,], %f[^,]",rs[i].ID_LEN,rs[i].resistance, rs[i].max_poewr)!=EOF)
{
printf("%s\t", rs[i].ID_LEN);
printf("%d\t", rs[i].resistance);
printf("%d\t\n", rs[i].max_poewr);
i++;
}
}
else
{
perror("Input.txt: ");
}
'''
输出
output image
您不想将 scanf 返回的值与 EOF 进行比较。
在您的情况下,格式字符串使得 scanf
永远不能匹配超过 1 个转换说明符,因为 %s[^,],
试图匹配文字输入字符串 [^,],
但 [
保证不匹配,因为 scanf 将停止为 %s
使用的第一个字符是空格。 [
不是空格。尝试类似的东西:
while(fscanf(fp, " %4[^,], %d, %f", rs[i].ID_LEN, &rs[i].resistance, &rs[i].max_poewr) == 3 )
但请注意,这将在第一列的空白处表现得很奇怪。您 可能 想尝试:" %4[^, \t\n] , %d, %f"
,但坦率地说,更好的解决方案是 stop using scanf。即使像这样微不足道的事情,你的行为在像 foo, 9999...9999
这样的输入上也是不确定的(其中第二列是任何超过 int
容量的值)。停止使用 scanf
。读取数据并用 strtol
和 strtod
.
解析它
我有包含以下内容的文本文件
inputfile
我使用函数从逗号分隔的输入文件中获取数据。 我想从中读取数据并删除逗号并将数据存储到 Struct Resistor_struct。 我试过下面的代码。
'''
#include<stdio.h>
//functions header
int blown_ressistors();
struct resistor_struct
{
char ID_LEN[5];
char id;
float max_poewr;
int resistance;
};
struct resistor_struct rs[100];
int blown_ressistors()
{
FILE *fp = fopen("input.txt", "r");
int i = 0;
if(fp!=NULL)
{
while(fscanf(fp, "%s[^,], %d[^,], %f[^,]",rs[i].ID_LEN,rs[i].resistance, rs[i].max_poewr)!=EOF)
{
printf("%s\t", rs[i].ID_LEN);
printf("%d\t", rs[i].resistance);
printf("%d\t\n", rs[i].max_poewr);
i++;
}
}
else
{
perror("Input.txt: ");
}
'''
输出 output image
您不想将 scanf 返回的值与 EOF 进行比较。
在您的情况下,格式字符串使得 scanf
永远不能匹配超过 1 个转换说明符,因为 %s[^,],
试图匹配文字输入字符串 [^,],
但 [
保证不匹配,因为 scanf 将停止为 %s
使用的第一个字符是空格。 [
不是空格。尝试类似的东西:
while(fscanf(fp, " %4[^,], %d, %f", rs[i].ID_LEN, &rs[i].resistance, &rs[i].max_poewr) == 3 )
但请注意,这将在第一列的空白处表现得很奇怪。您 可能 想尝试:" %4[^, \t\n] , %d, %f"
,但坦率地说,更好的解决方案是 stop using scanf。即使像这样微不足道的事情,你的行为在像 foo, 9999...9999
这样的输入上也是不确定的(其中第二列是任何超过 int
容量的值)。停止使用 scanf
。读取数据并用 strtol
和 strtod
.