假设文件以这种方式组织:
1.2 # 3.4 # 4.0
2.3 # 2.3 # 1.2
在C中读取文件并将数据存储在数组中。同时,你应该判断有多少行。
我的问题是1)我不知道如何声明数组,因为我不知道文件中存在多少个数字,所以我应该先查看该文件并计算数字?
2)我不知道如何判断行号,因为文件中的最后一个'\ n'可能存在或不存在。
答案 0 :(得分:1)
atof(ascii to float):
答案 1 :(得分:1)
使用fscanf
:
fscanf()函数应从命名输入流中读取。 [...]每个函数读取字节,根据格式解释它们,并将结果存储在其参数中。作为参数,每个都需要一个下面描述的控制字符串格式,以及一组指示转换输入应存储位置的指针参数。
答案 2 :(得分:1)
答案1)如果您事先不知道元素的数量,如何声明数组,使用原始向量无法解析,您将必须创建自己的增长能力向量。
typedef struct {
double * v;
unsigned int size;
} Vector;
此结构是新数据类型的基础。您需要一个API,例如:
Vector createVector();
void addToVector(Vector *v, double x);
double getFromVector(Vector *v, unsigned int pos);
void modifyInVector(Vector *v, unsigned int pos, double x);
unsigned int sizeOfVector(Vector * v);
void destroyVector(Vector *v);
API的关键成员是createVector,destroyVector和addToVector。由于这可能是家庭作业,我不会解决这个问题。
在createVector中,您基本上必须将所有字段都设置为0。 在destroyVector中,你必须free()v; 在addToVector中,您必须调整保留空间的大小(),以便另一个新项目适合:
size_t newSize = ( v->size +1 ) * sizeof( double );
现在你必须用新的大小调用realloc()。
这基本上都是。如果想要更好的性能,还可以引入向量的容量,这样每次添加新值时都不必增长。例如,在C ++中构建STL的人使每次超出容量时矢量类增长到两倍。但是,无论如何,这是另一个故事。
答案 3 :(得分:0)
以下代码从stdin
控制台读取,以您提供的格式处理数字并再次打印出来,以便检查是否正确。
#include <stdio.h>
int main(int ac, char *av[])
{
float a, b, c;
scanf("%f # %f # %f", &a, &b, &c);
printf("%f # %f # %f", a, b, c);
printf("\n");
}
尽管此代码有效,但它不是很强大。它需要数字之间字符的精确序列' # '
,并且在连续的最后一个数字之后只允许换行。
对于更强大的解决方案,您必须找到每个数字开头的字符索引,并在该位置执行fscanf
。
答案 4 :(得分:0)
浮点具有小数分数的精度损失。例如,像“0.1”这样的简单数字需要无限多的位来准确表示它。
对于您显示的数字(小数点后只有一位数字),更好的想法是将每个数字乘以10,以避免浮点引起的精度损失。这将涉及编写您自己的“ASCII到整数”转换例程,该例程假装小数点位于其实际位置右侧的一个位置。它还可以节省空间,因为(对于您显示的数字,没有数字大于25.6)您可以将它们存储在8位整数(字符)数组中。
祝你的作业好运!