如何在C语言中从txt文件中读取和添加数字?

问题描述 投票:0回答:2

我想制作一个程序,从一个名为 数目.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;
}
c file scanf fgets
2个回答
1
投票

strcmp(fgets(str, MAX_LEN, pFile),"\0") 在很多方面都是错误的。首先, strcmp 必须是一个字符串(空指针不是),但 fgets 返回 NULL 错误或文件结束时,你需要检查它没有返回。你需要检查它是否没有回到 NULL 然后你就可以在 str. 然而,没有必要 strcmp 与...对抗 "\0" (或者,在这种情况下,相当于: "")来检测文件的结尾,因为那是当 fgets 返回 NULL.

另一个问题是,你的阅读与两个 fscanffgets - 选择一个并坚持下去。我建议 fgets 因为它通常更容易正确(例如,在无效输入上,要从 fscanf 并确保你不会陷入一个无限循环,同时也不会丢失任何输入)。) 当然,你需要将整数从 str 之后 fgets,虽然,但有很多标准函数可以实现(如。strtol, atoi, sscanf).

不要用 !feof(file) 作为循环条件 (参见,例如。为什么 "while ( !feof (file) ) "总是错误的?). 如果你是用 fgets当它返回时,结束循环 NULL.


0
投票

您可以使用 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;

}

0
投票

你的程序有多个问题。

  • 没有测试是否通过了命令行参数。
  • 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.