[英]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.