首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用feof()时处理尾部\n

使用feof()时处理尾部\n
EN

Stack Overflow用户
提问于 2012-11-13 00:22:55
回答 3查看 101关注 0票数 0

我已经写了一个小程序,它接受如下文件的输入:

代码语言:javascript
复制
13,22,13,14,31,22, 3, 1,12,10
11, 4,23, 7, 5, 1, 9,33,11,10
40,19,17,23, 2,43,35,21, 4,34
30,25,16,12,11, 9,87,45, 3, 1
1,2,3,4,5,6,7,8,9,10

并在每一行上输出小于50的最大数字和。

但是,如果输入的文件有尾随的换行符,循环就会多次运行,因此会将另一行添加到包含随机数据的数组中。因此,我正在寻找一种更好的方法来进行这种比较,以避免这个问题。我还假设所有行都有10个整数,因为我想不出更好的方法来进行行尾循环比较。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

void readLineData(int lineNo, int val[][10], FILE *fp);
int findSum(int lineNo, int val[][10], FILE *fp);

int main(int argc, char *argv[]) {
  FILE *fp;
  int val[5][10];

  // Open file.
  if ((fp = fopen(argv[1], "r")) == NULL)
    {
    perror("Cannot open file ");
    exit(EXIT_FAILURE);
    }


  for (int i = 0; !feof(fp); i++) // runs too many times if file ends with '\n'
    {
      readLineData(i, val, fp);
      printf("%d\n", findSum(i, val, fp));
    }

 fclose(fp);
 return EXIT_SUCCESS;
}

void readLineData(int lineNo, int val[][10], FILE *fp) {
  char c;  
  for (int i = 0; i < 10; i++) // assuming line contains 10 integers
    {
      fscanf(fp, "%d,", &val[lineNo][i]);
    }
}

int findSum(int lineNo, int val[][10], FILE *fp) {
  int highVal = 0;
  int value1 = 0;
  int value2 = 0;

  for(int i = 0; i < 10; i++) //each letter
    {
      for(int j = 0; j < 10; j++)// every other letter
    {
      if((val[lineNo][i] + val[lineNo][j]) > highVal && i != j && (val[lineNo][i] + val[lineNo][j]) <= 50)
        {
          highVal = val[lineNo][i] + val[lineNo][j];
          value1 = val[lineNo][i];
          value2 = val[lineNo][j];
        }
    }
    }
  printf("Line %d: largest pair is %d and %d, with a total of: ", lineNo+1, value1, value2);
  return highVal;
}

任何关于循环比较和通用符号技巧的帮助都是非常受欢迎的。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-11-13 00:29:00

发布的代码没有区分具有5个整数的两行和(预期)具有10个整数的一行。建议一次读入一行,使用fgets(),然后在读取行上使用sscanf(),以确保所有读取的整数都属于同一行。

检查输入操作的返回值。例如,sscanf() (和fscanf())返回所做的赋值次数。仅处理包含预期的10个整数的行,这将检测包括尾随空行在内的无效行。

例如:

代码语言:javascript
复制
/* Returns 1 on success and 0 on failure. */
int readLineData(int lineNo, int val[][10], FILE *fp)
{
    char line[1024]; /* Arbitrarily large. */
    if (fgets(line, sizeof(line), fp))
    {
        /* %n records position where processing ended. */
        int pos;
        const int result = sscanf(line,
                                  "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
                                  &val[lineNo][0],
                                  &val[lineNo][1],
                                  &val[lineNo][2],
                                  &val[lineNo][3],
                                  &val[lineNo][4],
                                  &val[lineNo][5],
                                  &val[lineNo][6],
                                  &val[lineNo][7],
                                  &val[lineNo][8],
                                  &val[lineNo][9],
                                  &pos);

        /* 10 integers and full line processed,
           except if new-line character present. */
        return 10 == result &&
               (pos == strlen(line) ||
                (pos + 1 == strlen(line) && '\n' == line[pos]));
    }
    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2012-11-13 00:29:00

您可以简单地自己使用换行符:

代码语言:javascript
复制
for (int i = 0; !feof(fp); i++) // runs too many times if file ends with '\n'
{
  readLineData(i, val, fp);
  printf("%d\n", findSum(i, val, fp));
  fscanf(fp, "%*c"); // read a character without storing it in a variable
}

请注意,无疑还有更好的方法,包括一次读取整行并简单地检查其内容;但这是最简单的方法,适合您已有的内容。

票数 0
EN

Stack Overflow用户

发布于 2012-11-13 00:29:58

您可以检查readLineData函数中的fscanf是否失败:

代码语言:javascript
复制
int readLineData(int lineNo, int val[][10], FILE *fp) {
  for (int i = 0; i < 10; i++) {// assuming line contains 10 integers
     if (fscanf(fp, "%d,", &val[lineNo][i]) != 1) {
         return 1;
     }
  }
  return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13347384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档