读取和写入C

时间:2015-11-22 22:24:48

标签: c

我是C的新手。这是我写的第一个涉及读写文件的程序。到目前为止,我能够读取文件,执行我需要的操作,但我遇到了两件事情。

  1. 无论文件是什么,它都会在阅读时省略最后一行。例如,如果文件包含:

    3
    5
    6
    

    它只会读取 3 5 。但如果我在底部留下一个空/空行,它将会读取所有三行。任何想法为什么会这样?

    1. 我现在需要采取我所做的,基本上将伏特转换为毫伏,微伏等,然后将其写回文件。到目前为止我一直在做的是从文件中读取它并通过控制台进行操作。基本上,我想将最后两个printf语句写入该文件。我有一些尝试,但它没有工作,我似乎无法在网上找到合适的支持。当我尝试时,它会完全删除之前文件中的内容。
    2. #include <stdio.h>
      #include <stdlib.h>
      
      int main(int argc, char** argv) {
          FILE * file = fopen ("bacon.txt", "r");
          float voltage = 0, voltageArray[100],  voltageToMilli = 0,voltageToMicro = 0, voltageToKilo = 0, voltageToMega = 0;
          int i = 1, j = 0;
      
          fscanf (file, "%f", &voltage);    
          while (!feof (file)) {
              printf("Line # %d\n", i);
              printf ("The voltage is: %f\n", voltage);
              voltageArray[j] = voltage;
              fscanf (file, "%f", &voltage); 
      
              printf("The voltage in Element %d is: %f Volts",j,voltageArray[j]);
              voltageToMilli = voltageArray[j] * 1000;
              voltageToMicro = voltageArray[j] * 1000000;
              voltageToKilo = voltageArray[j] * 0.001;
              voltageToMega = voltageArray[j] *0.000001;
              printf("\nThe voltage is %f Volts, which is: %f milliVolts, %f microVolts, %f kiloVolts, %f megaVolts",voltageArray[j],voltageToMilli,voltageToMicro,voltageToKilo,voltageToMega);
      
      
              printf("\n\n");
              i++;
              j++;
      
      
      
            }
          fclose (file);     
      
          return (0);
      }
      

      因为我是C的初学者,请尽量使解释清楚简单。谢谢!

2 个答案:

答案 0 :(得分:2)

对于第一个问题,问题是循环逻辑不正确。在每次迭代时,都会存储之前的读取数据,读取下一个数据,然后返回到循环的顶部。这样做的问题是下一次迭代之前不会存储下一个数据。但在读完最后一个数据项之后(以及在将其存储到数组中之前),feof检查始终为false。有关检查feof作为循环条件几乎总是错误的原因,请参阅this question

以下是如何重构代码以按预期读取所有项目的示例:

int rval;

while ((rval = fscanf(file, "%f", &voltage)) != EOF) {
    if (rval != 1) {
        printf("Unexpected input\n");
        exit(-1);
    }

    voltageArray[j] = voltage;

    /* Do the rest of your processing here. */    
}

答案 1 :(得分:1)

问题是文件中的最后一个数字后面没有任何内容, 所以,在读完文件中的最后一个数字后,feof(file)为真。 然后退出。

最简单的修复是将其更改为此

while(fscanf (file, "%f", &voltage) == 1) {

并删除其他fscanf调用。

这是有效的,因为fscanf()调用将在能够时返回1 读取数字0或EOF(负数) 否则。