我希望逐行传入一个C文件并使用scanf读取但跳过第一行

时间:2017-04-28 06:23:22

标签: c

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

int 
main(void){

 //Declare variables
  //Want to read the first line and then ignore it.  From the second line
  //I scan in the input values and then store them in their individual arrays.

     int yy, mm, dd, loc;
     double mx, mm;
         /*Read and discard the first line of the file*/
          scanf("%*[^\n]");

         /*Read from the second line*/
         while(scanf("%d,%d,%d,%d,%lf,%lf\n",
                    &loc, &yy, &mm, &dd, &mx, &mn) == 6){

            //Storing each input in its own array.
  }

}

1 个答案:

答案 0 :(得分:1)

scanf("%*[^\n]");确实会读取并丢弃第一个换行符,但不会丢弃换行符本身。我建议将其与getchar();配对。

格式字符串中的

\n不会按照您的想法执行;因为scanf不是面向行的(而是面向字段的),您可能会发现它将丢弃所有空格字符,而不仅仅是换行符。我不认为这是一个问题。如果你想逐字地丢弃该行的其余部分,你可以使用建议放弃第一行的相同代码:

scanf("%*[^\n]");
getchar();

您的代码中有两个mm声明,但您没有提到错误消息,所以我猜您的测试用例不准确而且您想要其中一个( double)代替mn

考虑到这些问题,正如my testcase(包含在下面)中所示,我希望您的程序能够读取并丢弃第一行,然后读取int s的四个字段作为十进制数字后跟两个double s字段作为十进制数字,以逗号分隔。

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

int main(void) {
    int yy, mm, dd, loc;
    double mx, mn;

    scanf("%*[^\n]");
    getchar();

    while (scanf("%d,%d,%d,%d,%lf,%lf\n", &loc, &yy, &mm, &dd, &mx, &mn) == 6){
        printf("<%d> <%d> <%d> <%d> <%f> <%f>\n", loc, yy, mm, dd, mx, mn);
    }
}

更新:根据您的一条评论的外观,这实际上并不符合您的作业要求。 “你应该使用单独的while(getchar())循环来消耗第一行”,因此scanf("%*[^\n]"); getchar();应该用你的循环替换。

如果你最后在你的问题中添加了一个尝试,请随时ping我,这样我就可以提供反馈。