【问题标题】:C fscanf jump valuesC fscanf 跳转值
【发布时间】:2014-11-06 01:56:22
【问题描述】:

我正在尝试制作一个程序来读取文件中的值并将它们打印在屏幕上,现在部分是为了打印我的程序最终跳过一些值的文件​​。另一个问题,在这种情况下,如何为 v 动态分配内存?

文件:

3 -1 1 3 1 
2 2 1 -3.4 
5 -1 -2 5 0 -3 1 

代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define N 100

int main(){
float *v;
int i=0;

v=(float*)malloc(N*sizeof(float));

FILE* fp;
fp = fopen("entrada.txt","rt");
if (fp == NULL) {
printf("Erro na abertura do arquivo!\n");
exit(1); }

do{
fscanf(fp," %f",&v[i]);
printf("v[%d] = [%f]\n",i,v[i]);
i++;
}
while ((fscanf(fp," %f",&v[i])) != EOF);

int fclose (FILE* fp);
system("pause");
return 0;
}

结果:

v[0] = [3.00000]
v[1] = [1.00000]
v[2] = [1.00000]
v[3] = [2.00000]
v[4] = [-3.00000]
v[5] = [-1.00000]
v[6] = [5.00000]
v[7] = [-3.00000]
v[8] = [1.00000]

【问题讨论】:

  • do-while --> while.条件和内部执行两次读取。
  • 查看realloc 以了解v 的动态调整大小
  • int fclose (FILE* fp); --> fclose (fp);
  • 关于 realloc,我试过 v=(float*)realloc(v,i*sizeof(float));在一段时间内但不起作用
  • @Eraldo 可能是i -> (i+1)。或分配内存的完整大小的扩展。 v=malloc((size=100)*sizeof(float));..if(i==size) v= realloc(v, (size+=100)*sizeof(float));

标签: c arrays file scanf


【解决方案1】:

改成

while ((fscanf(fp," %f",&v[i])) != EOF){
    printf("v[%d] = [%f]\n",i,v[i]);
    i++;
}

【讨论】:

    【解决方案2】:

    您在一次迭代中进行两次文件读取,在 while 中更改条件:

    while ((fscanf(fp," %f",&v[i])) != EOF);
    

    到:

    while(!feof(fp));
    

    这应该可以防止值跳过问题。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2014-12-19
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多