在c中达到负数时结束读取文件

时间:2014-09-07 06:45:43

标签: c

我是c编程的新手,我有一个我无法解决的问题,是否有人可以帮助我? 这是条件, 我在“C语言文件处理”中练习自我, 我想要做的是计算文件中浮点数的数量,例如, 输入文件包含:

1.0 0.0 4.5 74.0 1.33 0.0 -1.0 1.0

输出将是: 6

所以,我想要的是计算包含输入文件的数量和数量 到达-1.0后,计数结束,-1.0将不包括在计数中。或-1.0将是文件的结尾。我怎样才能做到这一点?我正在使用C编程语言。

我有一些代码,但它只计算数字,直到达到EOF。

#include <stdio.h>

int main() {
  FILE *f=fopen("input.in","r");
  int c,count;

  if(f==NULL){ return 1; }   

  c = getc(f);    
  while(c != EOF){
    if (c  == ' ') 
    count++; 
    c = getc(f); 
  }fclose(f);

  printf ("Number of Cases: %d\n", count);
  return 0;
}

它只计算按空格分隔的输入数,但如果达到-1.0则不会停止。

谢谢!

3 个答案:

答案 0 :(得分:1)

让我们看看你的程序的主循环:

c = getc(f);    
while (c != EOF) {
    if (c  == ' ') count++; 
    c = getc(f); 
}

显然你正在测试,因此找到了EOF案例,但在这个循环中你测试负输入?答:你不清楚你是不是会找到它。其他人建议使用getc() 以外的函数,它一次读取1个字符(比如scanf)。但是,为了说明的目的,让我们继续你的基本大纲:

c = getc(f);    
while (c != EOF) {
    if (c == '-') break;       /* saw a minus, must be the end */
    if (c  == ' ') count++;    /* saw a space, must be a gap between numbers, count that */
    c = getc(f); 
}

请注意,虽然更好,但这仍然不太正确 - 想象一下这个输入1.0 2.0 3.0你将计算两个数字间距,但你不计算最后一个数字。此外,您无法处理数字之间多个空格的情况(1.0 2.0 3.0 -5)

int ws = 1;                               /* white space mode is on */
while ((c = getc(f)) != EOF) {
    if (ws && (c == ' ')) continue;       /* more white space, just skip */
    if (ws && (c == '-')) break;          /* white space ended with a minus, done */
    if (ws) ++count;                      /* white space ended, start of new  positive number */
    ws = (c == ' ');                      /* are we starting whitespace mode again? */
}

想象一下各种输入字符串,并在脑海中一次一行地浏览这段代码。如果您发现问题,请考虑如何解决问题。重复。 提示:-1 vs -2

答案 1 :(得分:0)

#include <stdio.h>

int main() {
  FILE *f=fopen("input.in","r");
  int count=0;
  double x;

  if(f==NULL){ return 1; }

  while(fscanf(f, "%lf", &x)==1 && !(x < 0)){
    count++; 
  }
  fclose(f);

  printf ("Number of Cases: %d\n", count);
  return 0;
}

答案 2 :(得分:0)

#include<stdio.h>
int main(){

FILE* f = fopen("a.in","r");
float ld;
int c=0,i;
double values[100];

if(f == NULL){
    printf("File not found!");
    return;
}

while(fscanf(f,"%f\n",&ld) == 1){    
    if(ld == -1.0){ 
        printf("Number of Cases: %d\n",c);
    }
    c++;
}fclose(f);
return 0;