我正在尝试解决一个问题,但我不明白我该如何去做。任务如下:
- 有一个像这样的文本文件(第一个数字是要处理的值的数量):
5 1.1 2.2 3.3 4.4 5.5
5 5.5 4.4 3.3 2.2 1.1
2 0.1 -0.1
2 1 1
5 1 2 3 4 5
6 1 2 3 4 5 6
输出如下:
6.6 6.6 6.6 6.6 6.6
1.1 0.9
Error(Number n1 != Number n2)
我应该想出一个函数read(file *fp, array[])用于读取文件,add(a1[], a2[], sum[])用于从两个单独的行添加数字,并输出(sum[])以在屏幕上给出结果并在main()中调用它们。任务是将下一行的值添加到它们各自的位置,如果元素的数量不相同,则给出错误。
我在想,只要我没有到达'n',我应该读第一行,一旦到达,就去下一行,以此类推。但是我不能写一个函数从文件中读取。这是我的尝试,但我不知道如何继续。
float read(FILE *fp, float number[]) //For reading individual rows from txt file
{
int count;
if(fscanf(fp, "%d", &number) != 1) return -1;
for(int i = 0; i != 'n'; ++i) {
if(fscanf(fp, "%f", &number[i]) != 1) {
return -1;
}
}
return number[0];
}
如果有人能帮忙,我将非常感激。提前谢谢你。
如果有人能帮忙的话。
-
读取一个整数——>
n1
. -
为
n1
号分配内存:float sum[n1]
-
在循环中,将其余行读入
sum[]
。 -
读取一个整数——>
n2
. -
如果
n1 != n2
,打印错误,否则在循环中(n1
次),读取FP,与前一个sum[i]
求和并打印。
注意:这种方法不能很好地处理格式错误的输入。需要更高级的代码来检测非数字输入,每行缺少/额外的数字,缺少第二行,超出范围的数字计数,内存不足,通常的怀疑....
您不需要检测换行,因为每行都有项的计数。那么就读那么多条目吧。
您应该将第一个数字读入count
,然后将其用作循环的极限。函数的返回类型应该是int
。
int read(FILE *fp, float number[]) //For reading individual rows from txt file
{
int count;
if(fscanf(fp, "%d", &count) != 1) return -1;
for(int i = 0; i < count; ++i) {
if(fscanf(fp, "%f", &number[i]) != 1) {
return -1;
}
}
return count;
}
如何跳出思维定势?
使用两个文件指针来读取数据,而不是形成一个数组来存储浮点数据。
也许不完全是OP想要的,但它确实避免了float
内存管理问题。
// Demonstrative code
// Return -1 on error,
// return 0 on number mis-match,
// else return 1
static int read_line_pair(FILE *f1, FILE *f2) {
int n1, n2;
fscanf(f2, "%*[^n]"); // Skip line
if (fscanf(f1, "%9d", &n1) != 1 || fscanf(f2, "%9d", &n2) != 1) {
return -1;
}
if (n1 != n2) {
printf("Error(Number %d != Number %d)n", n1, n2);
return 0;
}
while (n1 > 0) {
n1--;
double v1, v2;
if (fscanf(f1, "%lf", &v1) != 1 || fscanf(f2, "%lf", &v2) != 1) {
return -1;
}
printf("%g ", v1 + v2);
}
fscanf(f1, "%*1[n]"); // Read trailing n
fscanf(f2, "%*1[n]");
fscanf(f1, "%*[^n]");
printf("n");
return 1;
}
int main() {
const char *filename = "line_pairs.txt";
FILE *f = fopen(filename, "w");
assert(f);
fprintf(f, // data
"5 1.1 2.2 3.3 4.4 5.5n"
"5 5.5 4.4 3.3 2.2 1.1n"
"2 0.1 -0.1n"
"2 1 1n"
"5 1 2 3 4 5n"
"6 1 2 3 4 5 6n");
fclose(f);
FILE *f1 = fopen(filename, "r");
assert(f1);
FILE *f2 = fopen(filename, "r");
assert(f2);
int result;
while ((result = read_line_pair(f1, f2)) == 1) {
;
}
fclose(f1);
fclose(f2);
}
输出6.6 6.6 6.6 6.6 6.6
1.1 0.9
Error(Number 5 != Number 6)