我非常困难,不知道从哪里开始我正在进行的项目。想法是从输入文件中读取数据(整数)。我们应该逐行读取每个整数。我们不能使用数组。只有循环。另外,我们应该忽略< 2整数的行(即下面例子中的第1行和第3行)。
输入文件的格式如下:
3
5 -5 0
5
1 -2 3 -4 5
这是我到目前为止(摘录):
while (fscanf(inFileHandle, "%d", &num) == 1) {
//read in one number, add to sum
sum += num;
if (num > highest) {
highest = num;
}
else if (num < lowest) {
lowest = num;
}
}
/* while ((c = (char)getc(inFileHandle)) != EOF) {
if (c == ' ') {
printf("space found");
}
else if (c == '\n') { //newline reached
}
else {
printf("int found");
}
}*/
fclose(inFileHandle);
对于读入的数据,我们应该进行计算,但这不是这个问题的重点。
正如你所看到的,我有一个使用fscanf读取整数的while循环,但这并不完全是我想要的。如果行有两个或更多整数(如输入文件中的第2行和第4行),我只想读取整数。
我也尝试使用getc()一次读取一个字符,然后检查单个字符&#34; c&#34;,但我用这个想法达到了死胡同。
最好的开始方式是什么?
如果有什么不清楚,请告诉我。
答案 0 :(得分:0)
外部循环将扫描两个项目int和char。当外循环扫描int和空格时,内循环将设置变量并继续扫描直到扫描int和换行符。
char ws = ' ';
int num = 0;
while ( result = fscanf ( inFileHandle, "%d%c", &num, &ws)) {
if ( EOF == result) {
break;
}
if ( 2 == result && ' ' == ws) {//scanned an int an a space
sum = num;
highest = num;
lowest = num;
while ( 2 == fscanf ( inFileHandle, "%d%c", &num, &ws)) {
sum += num;
if ( highest < num) {
highest = num;
}
if ( lowest > num) {
lowest = num;
}
if ( '\n' == ws) {//quit when a newline is scanned
break;
}
}
printf ( "sum is %d\n", sum);
printf ( "highest is %d\n", highest);
printf ( "lowest is %d\n", lowest);
}
}
答案 1 :(得分:0)
如果不允许使用数组(包括作为char数组的字符串),则必须在一次char时读取该文件并手动构建整数值。要做到这一点,你需要一些状态变量来跟踪进度。
可能就像:
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main(void) {
int max = INT_MIN;
int min = INT_MAX;
int current;
int numbersOnThisLine = 0;
int parsingNumber = 0;
int negative;
int number = 0;
int firstNumber;
FILE* f = fopen("numbers.txt", "r");
if (!f)
{
printf("file error\n");
return 1;
}
while ((current = fgetc(f)) != EOF)
{
switch (current)
{
case '-':
negative = 1;
break;
case ' ':
if (parsingNumber)
{
if (negative) number = -number;
printf("Found %d\n", number);
++numbersOnThisLine;
if (numbersOnThisLine == 1)
{
firstNumber = number;
}
if (numbersOnThisLine >= 2)
{
if (firstNumber > max) max = firstNumber;
if (firstNumber < min) min = firstNumber;
if (number > max) max = number;
if (number < min) min = number;
}
}
parsingNumber = 0;
number = 0;
negative = 0;
break;
case '\n':
if (parsingNumber)
{
if (negative) number = -number;
printf("Found %d\n", number);
++numbersOnThisLine;
if (numbersOnThisLine >= 2)
{
if (number > max) max = number;
if (number < min) min = number;
}
}
numbersOnThisLine = 0;
parsingNumber = 0;
number = 0;
negative = 0;
break;
default:
if (current > '9' || current < '0')
{
printf("Illegal file format\n");
fclose(f);
return 1;
}
parsingNumber = 1;
number = 10 * number + (current - '0');
break;
}
}
fclose(f);
printf("min=%d max=%d\n", min, max);
return 0;
}
使用numbers.txt:
-12343
5 -5 -11 0
555
444 -2 343 -4 7
输出是:
Found -12343
Found 5
Found -5
Found -11
Found 0
Found 555
Found 444
Found -2
Found 343
Found -4
Found 7
min=-11 max=444
BTW 上面的代码实际上在printf
中使用了char数组(也就是字符串) - 如果你也必须避免使用它,你可以使用putc
进行打印。