繁体   English   中英

用于读取文件或标准输入的简单 C 代码

[英]simple C code to either read a file or stdin

对 C 来说是全新的。 我正在尝试编写一个程序来读取文件中包含的整数(作为 arg 传递)或从stdin 读取的第一个数字应该指示数组大小。 我有一些东西,但它会引发分段错误。 请帮忙。

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char* argv[]) {

    FILE *f;
    int n, numbers[n], firstNum;

    if (argc != 0)
    {

        f = fopen(argv[1], "r");

        fscanf(f, "%d", & firstNum);

        int numbersArray[firstNum];

        for (int i = 0; i < firstNum; i++)
        {
            fscanf(f, "%d", &numbersArray[i]);
        }

        for (int i = firstNum; 0 <= i; i--)
        {
            printf("Numbers: %d\n\n", numbersArray[i]);
        }
        fclose(f);
    }
    else
        scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        fscanf(stdin, "%d", &numbers[i]);
        printf("%d\n", i, numbers[i]);
    }

    return 0;
}

首先,始终初始化您的变量,例如评论中提到的 kaylum 和我自己。 与其他一些编程语言不同,C 不会为您初始化变量。 现在对于您发布的问题,您的想法大部分是正确的,但我建议您更改以下内容:

int n, numbers[n], firstNum;

int n = 0, numbers[1000], firstNum = 0;

如果您对此不满意,您可以在初始化 n 时将 numbers[n] 移低,但我不建议这样做。 取而代之的是,由于您正在学习 C ,因此请查看使用指针动态分配的 arrays 。 一些帮助您理解指针的链接:

https://www.cprogramming.com/tutorial/c/lesson6.html https://www.tutorialspoint.m/cprogramming/

接下来看看你的fopen它有一个返回值,告诉你它是否成功打开了你请求的文件。

所以你可以添加:

    f = fopen(argv[1], "r");

    if (f == NULL)
    {
        printf("File Not Found!");
        return -1;
    }

修改条件以适应您要处理该错误的方式。

当您读取文件时,用户指定您正在读取的数组的大小,但您应该考虑文件可能不包含确切数量的元素这一事实。 您正在使用fscanf的 function 有一种方法可以告诉您,这就是它的返回值。 它将返回EOF ,这是一个转换为文件结尾的特殊值。

考虑将您的 fscanf 修改为:

    if (fscanf(f, "%d", &firstNum) == EOF)
    {
        printf("ERROR");
    }

或者,如果您处于 for 循环中,请放置break

最后一件事是您不必为stdin显式使用fscanf ,用户已指定他将通过stdin输入它,因此您也可以使用scanf 希望这对您未来的 C 努力有所帮助并祝您好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM