c - 将 2 列双精度的 .txt 转换为 2 个数组并读取它们
问题描述
我有一个由两列浮点数组成的 .txt 文件。第一列包含变量 A 的值,第二列包含变量 B。
1.0 2.0
1.0 3.0
[ROWS 之间没有空格,我不得不在这里这样写,否则它不会显示出来。]
我必须使用这些数字来求解 C 的这个方程:
A_{j} + B_{j+1}(X) = C
Aj = A 的第 j 项(也称为第 j 行项),j+1 将是之后的项。
我想浏览整个文本文件,以获取不同的 j。让我们假设 j 上升到 10,所以 .txt 中有 10 行。
int j;
for (j = 0; j < 10; j++){
C = A[j] + B[j+1]*X;
如您所见,我的计划是将这些列转换为两个数组。1 代表 A,1 代表 B。
如果我读到这样的文字:
void readAB(double *A, double *B) {
FILE *infile;
if(2!=fscanf(infile,"%lf %lf", A, B)) {
printf("Error\n");
exit(1);
}
fclose(infile);
}
到目前为止我所知道的就是像这样调用 int_main :
double A;
double B;
readAB(&A,&B);
但是我该如何称呼它,将它转换成一个数组以供以后使用呢?
解决方案
让它动态完成(即,如果你不知道文本文件有多少行)
#define MALLOC_STEP 32
#define MAXLINE 256
typedef struct
{
size_t datapos;
size_t buffsize;
double data[];
}data_t;
int myrealloc(data_t **data)
{
if(!*data || !(*data) -> buffsize || ((*data) -> datapos == (*data) -> buffsize - 1))
{
size_t newbuffsize = !*data ? MALLOC_STEP : (*data) -> buffsize + MALLOC_STEP;
data_t *tmpbuff = realloc(*data, sizeof(**data) + newbuffsize * sizeof((*data) -> data[0]));
if(!tmpbuff) return -1;
if(newbuffsize == MALLOC_STEP) tmpbuff -> datapos = 0;
tmpbuff -> buffsize = newbuffsize;
*data = tmpbuff;
}
return 0;
}
int readNext(FILE *fp, data_t **data1, data_t **data2)
{
char line[MAXLINE];
if(fgets(line, MAXLINE, fp) == NULL) return -1;
if(myrealloc(data1) || myrealloc(data2)) return 1;
if(sscanf(line, "%lf %lf", &((*data1) -> data[(*data1) -> datapos]), &((*data2) -> data[(*data2) -> datapos])) != 2) return -1;
(*data1) -> datapos++;
(*data2) -> datapos++;
return 0;
}
int main()
{
data_t *arr1 = NULL, *arr2 = NULL;
FILE *fp = fopen("test.txt", "w");
int result;
// create test data
if(fp)
{
fprintf(fp, "34563.5674 5654634.233445\n");
fprintf(fp, "34563.5674e-45 5654634.233445e1\n");
fprintf(fp, "34563.5674e45 5654634.233445\n");
fprintf(fp, "34563.5674e10 5654634.233445e3\n");
fclose(fp);
}
fp = fopen("test.txt", "r");
if(fp)
{
do
{
result = readNext(fp, &arr1, &arr2);
}while(!result);
printf("Datapos %u, Out numbers are:\n", arr1 -> datapos);
for(size_t index = 0; index < arr1 -> datapos; index++)
{
printf("row %04u arr1 = %lg, \t\tarr2 = %lg\n", index, arr1 -> data[index], arr2 -> data[index]);
fflush(stdout);
}
}
}
你可以自己轻松玩https://godbolt.org/z/9giuWS
推荐阅读
- php - 加密/解密个人数据 Codeigniter
- ios - Amazon polly 没有读取第一个单词/在 iOS Swift 中听不到
- batch-file - 如何使用 VBScript 或批处理文件反转窗口颜色?
- kotlin - AWS/Aurora:是否可以知道从属设备是否正确使用
- php - left join count ignore left table column from counting
- java - 在 RESTAssured/Java 中针对 JSON 响应验证 UI
- android - 带有 Youtube Player API 的 Viewpager
- java - 为什么此错误消息与另一个一起出现?
- azure - ARM - 模板 - 多个参考
- c# - 解析 DataType 时出现 JSON 反序列化到 DataTable 问题