无法在文件中读取令牌

时间:2016-02-15 02:29:25

标签: c

我正在完成需要从输入文件中读取的家庭作业。然而,程序只是出错而且我无法说明原因。这是我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int main()
{
  FILE *fp = fopen( "input.txt", "r");
  FILE *outputF = fopen( "output.txt", "w");
  if( !fp || !outputF){
    fprintf(stderr, "can't open files for input/output");
    exit(EXIT_FAILURE);
  }

  char line[250];
  double factor;
  int expo;

  while( fscanf( fp, "%f%d", factor, expo) == 1){
    if( factor == 0){
       fprintf(outputF, "%s\n", "undefined");
    }
  else{
      double total = 1;
      for(int i = 0; i < expo; i++){
        total = total * factor;
      }
      fprintf(outputF, "%f", total);
  }
 }
 fclose(fp);
 fclose(outputF);

 return EXIT_SUCCESS;
} 

我认为问题出在&#34;而#34;但我也尝试使用以下代码,它不起作用。输入文件有一个doulbe和一个由空格分隔的int。即&#34; 2.33 3&#34;

while(fscanf(fp, "%s", line) == 1){
 char *token;
  token = strtok(line, " ");
  float factor;
  sscanf(token, "%f", &factor);
  token = strtok(NULL, "\n");
  int expo;
  sscanf(token, "%d", &expo);

1 个答案:

答案 0 :(得分:0)

  1. 第一个问题while (fscanf( fp, "%f%d", factor, expo) == 1)必须是

    while (fscanf(fp, "%f%d", &factor, &expo) == 2)
    

    阅读fscanf()手册。它不返回真值,它返回字符串中匹配的说明符的数量。

  2. 第二个问题,未定义的行为由于scanf()格式说明符不正确,double需要"%lf"而不是"%f"

  3. 第三个问题,您必须传递要阅读的值的地址,以允许scanf()将结果存储在那些变量中,&正在做什么在上面的固定fscanf()

  4. 注意:您的编译器应该警告这些错误中的两个错误的格式说明符,并且不对这些特定的说明符使用运算符的&地址。有两个选项,您忽略这些警告,或者您正在编译并关闭警告。这些可能的原因中的第一个非常糟糕,不要忽视警告。第二,阅读编译器的文档,并尽可能多地进行诊断,以避免愚蠢的错误。