gpt4 book ai didi

c - 使用 feof() 时处理尾随\n

转载 作者:行者123 更新时间:2023-11-30 14:22:56 26 4
gpt4 key购买 nike

我编写了一个小程序,它接受文件的输入,例如:

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 个整数,因为我想不出更好的方法来进行行尾循环比较。

#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;
}

非常欢迎有关循环比较和一般符号提示的任何帮助。

谢谢

最佳答案

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

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

例如:

/* 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;
}

关于c - 使用 feof() 时处理尾随\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com