读取文件,只有当两行中值的数目相同时才继续

  • 本文关键字:继续 两行 文件 读取 c
  • 更新时间 :
  • 英文 :


我正在尝试解决一个问题,但我不明白我该如何去做。任务如下:

  1. 有一个像这样的文本文件(第一个数字是要处理的值的数量):
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];
}
如果有人能帮忙,我将非常感激。提前谢谢你。

如果有人能帮忙的话。

  1. 读取一个整数——>n1.

  2. n1号分配内存:float sum[n1]

  3. 在循环中,将其余行读入sum[]

  4. 读取一个整数——>n2.

  5. 如果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)

相关内容

  • 没有找到相关文章

最新更新