C 我能';t将数据读入数组

C 我能';t将数据读入数组,c,C,我试图从文本文件中读取数据并将其复制到数组中,但我的代码不起作用。代码如下: #include <stdio.h> int main(int argc, char *argv[]) { int i; FILE *data; data = fopen(argv[1], "r"); ....... fclose(data); } 与 它起作用了 这是完整的代码 #include <stdio.h> int main(int ar

我试图从文本文件中读取数据并将其复制到数组中,但我的代码不起作用。代码如下:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;

    FILE *data;
    data = fopen(argv[1], "r");

    .......

    fclose(data);
}

它起作用了

这是完整的代码

#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
i=0;
FILE *data;
data = fopen(argv[1], "r");

while (!feof(data)) {
    fscanf(data, "%i", &aa[i]);
    i++;
}

fclose(data);
printf("%i\n", aa[0]);
}

您应该始终编写基本的错误检查代码,以检查任何可能合理失败的内容,例如:

#include <stdio.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int i;
    FILE *data;

    if (argc < 2)
    {
        fprintf(stderr, "Missing arguments: %s\n", usage);
        exit(1);
    }

    data = fopen(argv[1], "r");
    if (data == NULL)
    {
        fprintf(stderr, "fopen('%s') failed, errno = %d, argv[1], errno);
        exit(2);
    }

    .......

    fclose(data);

    return (0);
}
#包括
#包括
int main(int argc,char*argv[])
{
int i;
文件*数据;
如果(argc<2)
{
fprintf(stderr,“缺少参数:%s\n”,用法);
出口(1);
}
数据=fopen(argv[1],“r”);
如果(数据==NULL)
{
fprintf(stderr,“fopen(“%s”)失败,错误号=%d,argv[1],错误号);
出口(2);
}
.......
fclose(数据);
返回(0);
}

这样,如果
fopen
失败,那么(a)您将不会崩溃,(b)您将获得一些关于文件未打开原因的有用信息。

您应该始终为任何可能合理失败的内容编写基本错误检查代码,例如:

#include <stdio.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int i;
    FILE *data;

    if (argc < 2)
    {
        fprintf(stderr, "Missing arguments: %s\n", usage);
        exit(1);
    }

    data = fopen(argv[1], "r");
    if (data == NULL)
    {
        fprintf(stderr, "fopen('%s') failed, errno = %d, argv[1], errno);
        exit(2);
    }

    .......

    fclose(data);

    return (0);
}
#包括
#包括
int main(int argc,char*argv[])
{
int i;
文件*数据;
如果(argc<2)
{
fprintf(stderr,“缺少参数:%s\n”,用法);
出口(1);
}
数据=fopen(argv[1],“r”);
如果(数据==NULL)
{
fprintf(stderr,“fopen(“%s”)失败,错误号=%d,argv[1],错误号);
出口(2);
}
.......
fclose(数据);
返回(0);
}

这样,如果
fopen
失败,则(a)您不会崩溃,(b)您将获得一些关于文件未打开原因的有用信息。

您应该在运行代码时传递文件名

./a.out file.txt.
如果file.txt不存在,它将抛出错误作为分段错误

试试这个代码,它可以工作

#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    int j = 0;
    int aa[100];    //declare an int array to store the data, as you are retrieving using %i
    i=0;
    FILE *data;
    data = fopen(argv[1], "r");

    while (!feof(data)) {
        fscanf(data, "%i", &aa[i]);
        i++;
    }
    i--;
    fclose(data);
    for(j; j < i; j++)
        printf("%i\n", aa[j]);
}
#包括
int main(int argc,char*argv[])
{
int i;
int j=0;
int aa[100];//声明一个int数组来存储数据,因为您正在使用%i进行检索
i=0;
文件*数据;
数据=fopen(argv[1],“r”);
而(!feof(数据)){
fscanf(数据,“%i”和aa[i]);
i++;
}
我--;
fclose(数据);
对于(j;j
在file.txt中,提供您提供的任何数据

运行pass/a.out file.txt时


确保file.txt在同一个文件夹中或给出整个路径

运行代码时应传递文件名

./a.out file.txt.
如果file.txt不存在,它将抛出错误作为分段错误

试试这个代码,它可以工作

#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    int j = 0;
    int aa[100];    //declare an int array to store the data, as you are retrieving using %i
    i=0;
    FILE *data;
    data = fopen(argv[1], "r");

    while (!feof(data)) {
        fscanf(data, "%i", &aa[i]);
        i++;
    }
    i--;
    fclose(data);
    for(j; j < i; j++)
        printf("%i\n", aa[j]);
}
#包括
int main(int argc,char*argv[])
{
int i;
int j=0;
int aa[100];//声明一个int数组来存储数据,因为您正在使用%i进行检索
i=0;
文件*数据;
数据=fopen(argv[1],“r”);
而(!feof(数据)){
fscanf(数据,“%i”和aa[i]);
i++;
}
我--;
fclose(数据);
对于(j;j
在file.txt中,提供您提供的任何数据

运行pass/a.out file.txt时

确保file.txt位于同一文件夹中或给出完整路径

  • 您可能正在传递当前目录中不可用的文件

  • 以文件名为参数指定有效的文件目录

  • 检查“fopen”后是否为空

  • 使用gcc-g-Wall main.c编译

    并使用gdb调试器来识别错误

  • 您可能正在传递当前目录中不可用的文件

  • 以文件名为参数指定有效的文件目录

  • 检查“fopen”后是否为空

  • 使用gcc-g-Wall main.c编译


    并使用gdb debugger来识别错误

    运行程序时传递的命令行参数是什么?另外,在对fopen的调用可能失败后,ERRNO的值是多少?应进行调试以查看argv[1]中的内容+应测试是否确实有argv[1]。请阅读更多文档。当您以不起作用的方式运行时,您会遇到什么错误?编译错误?链接错误?崩溃如果崩溃,是什么信号?我不明白为什么你发布的代码中会出现segfault。使用调试器或
    printf
    查找崩溃发生的确切位置。此外,如果您进行了正确的错误检查(
    argc>1
    data!=NULL
    等),这些错误会变得更容易检测。运行程序时传递的命令行参数是什么?另外,对fopen的调用可能失败后,ERRNO的值是多少?应该调试以查看argv[1]中的内容+应该测试您是否确实有argv[1]。请阅读更多文档。当您以不起作用的方式运行时,您会遇到什么错误?编译错误?链接错误?崩溃如果崩溃,是什么信号?我不明白为什么你发布的代码中会出现segfault。使用调试器或
    printf
    查找崩溃发生的确切位置。另外,如果你做了正确的错误检查(
    argc>1
    data!=NULL
    等),这些错误会变得更容易检测。如果OP要检查错误,他最好也检查
    argc>1
    。这是一个很好的信息,但不是答案。这就是为什么我把检查fopen和errno的返回值放在注释中。@xaxxon:你可能有道理,但格式化代码在注释中不起作用,我觉得OP在继续学习C之前确实需要了解错误检查的基本知识。所以我想这是一个答案,但这是对隐含问题的更全面的回答:“我的代码怎么了?”。如果OP要检查错误,他最好也检查
    argc>1
    。这是一个好信息,但不是答案。这就是为什么我把检查fopen和errno的返回值放在注释中。@xaxxon:你可能有道理,但格式化代码在注释中不起作用,我觉得OP确实需要在