我想制作一个程序,从一个名为 数目.txt ,每行包含不同的数字。
例如,我创建了这个程序。
8321
12
423
0
...
我创建了这个程序,但它不能正常工作。 我尝试了很多东西,但不知道该怎么做。谁能指导我正确的方向? 谢谢你!我想做一个程序,让它能正常运行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1000
int main(int argc, char *argv[]) {
char str[MAX_LEN];
FILE *pFile = fopen(argv[1], "r");
int num;
int sum = 0;
int count = 0;
if (pFile == NULL) {
printf("Error opening file.\n");
return 1;
}
while (!feof(pFile) && !ferror(pFile)) {
if (fscanf(pFile, "%d", &num) == 1) {
count++;
while (strcmp(fgets(str, MAX_LEN, pFile), "\0") == 0) {
printf("%s", str);
//sum = sum + (int)(fgets(str, MAX_LEN, pFile));
printf("\n");
}
}
}
fclose(pFile);
printf("count = %d \n", count);
printf("sum = %d \n", sum);
return 0;
}
strcmp(fgets(str, MAX_LEN, pFile),"\0")
在很多方面都是错误的。首先, strcmp
必须是一个字符串(空指针不是),但 fgets
返回 NULL
错误或文件结束时,你需要检查它没有返回。你需要检查它是否没有回到 NULL
然后你就可以在 str
. 然而,没有必要 strcmp
与...对抗 "\0"
(或者,在这种情况下,相当于: ""
)来检测文件的结尾,因为那是当 fgets
返回 NULL
.
另一个问题是,你的阅读与两个 fscanf
和 fgets
- 选择一个并坚持下去。我建议 fgets
因为它通常更容易正确(例如,在无效输入上,要从 fscanf
并确保你不会陷入一个无限循环,同时也不会丢失任何输入)。) 当然,你需要将整数从 str
之后 fgets
,虽然,但有很多标准函数可以实现(如。strtol
, atoi
, sscanf
).
不要用 !feof(file)
作为循环条件 (参见,例如。为什么 "while ( !feof (file) ) "总是错误的?). 如果你是用 fgets
当它返回时,结束循环 NULL
.
您可以使用 strtok
来分割每一行的数字,然后用 atoi
函数将字符串转换为 int
.
例如,如果每行只有一个数字,就不需要使用:
while(fgets(str, MAX_LEN, pFile)) {
// if the numbers are separated by space character
char *token = strtok(str, " ");
while(token != NULL) {
sum += atoi(token);
strtok(NULL, " ");
}
}
如果每行只有一个数字,你不需要使用 strtok
:
while(fgets(str, MAX_LEN, pFile)) {
sum += atoi(str);
// OR
sscanf(str,"%d\n", &new_number)
sum += new_number;
}
你的程序有多个问题。
while (!feof(pFile) && !ferror(pFile))
遍历文件总是错误的。feof()
只有在实际读取后才给出有效信息。只是测试是否读取失败。fscanf(pFile, "%d", &num) == 1)
添加数字,而不是只计算数字。strcmp(fgets(str, MAX_LEN, pFile), "\0")
将会在文件的最后失败,当 fgets()
返回 NULL
.如果文件只包含数字,只需用 fscanf()
并在您浏览文件时添加它们。
这里是一个修改后的版本。
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE *pFile;
int num
int sum = 0;
int count = 0;
if (argc < 2) {
printf("Missing filename\n");
return 1;
}
if ((pFile = fopen(argv[1], "r")) == NULL) {
printf("Error opening file %s\n", argv[1]);
return 1;
}
while (fscanf(pFile, "%d", &num) == 1) {
sum += num;
count++;
}
fclose(pFile);
printf("count = %d \n", count);
printf("sum = %d \n", sum);
return 0;
}