无法从文件中读取数字并将其分配给C中的数组

时间:2018-02-12 03:32:49

标签: c arrays file-io

正如标题所述,我试图从外部文本文件中读取数字并将它们分配给数组。如果我手动创建数组,我能够操作数组并将结果写入另一个文件,但是fscanf()正在从文本文件中提取垃圾。这就是我现在所拥有的,我一直在阅读其他帖子,我现在已经改变了12次,但我认为我离解决方案越来越远了。

filename = argv[1];
FILE *fp;
fp = fopen(filename, "r");
if (fp == NULL) {
        printf("\n     Unable to open input file.\n\n");
        helpmssg();
        exitmssg();
}
while (getc(fp) != EOF){
        if (fscanf(fp,"%d", &c) == 1) {
                arr[i] = c;
                i++;
        }
}

理想情况下,这应该扫描指定为数字的命令行参数的文件,将其分配给数组的第一个点,然后重复直到文件末尾。非常感谢任何帮助。

文字档案:

12
23
99
66
47
2
-111
8

按要求添加整个主要功能:

void main(int argc,char** argv) {
char* filename;
char* outputfile;
char conf;
int arr[1000] = {0};
int n,a=0,d=0,h=0,i=0,c=0;
welcome();
        if (argc > 4 || argc < 3) {
                printf("\n     Invalid number of arguments.\n\n");
                helpmssg();
                exitmssg();
        }
        else if (argc == 4) {
                for (int i=3;i<argc;i++) {
                        if (argv[i][0] == '-') {
                                for(int z=1;z<strlen(argv[i]);z++) {
                                        if (argv[i][z] == 'a') {
                                                a=1;
                                        }
                                        else if (argv[i][z] == 'd') {
                                                d=1;
                                        }
                                        else if (argv[i][z] == 'h') {
                                                h=1;
                                        }
                                        else {
                                                        printf("\n     Invalid options in 3rd argument.\n\n");
                                                        helpmssg();
                                                        exitmssg();
                                        }
                                }
                        }
                        else {
                                printf("\n     3rd argument shoule begin with '-'\n\n");
                                helpmssg();
                                exitmssg();
                        }
        }       }
        filename = argv[1];
        FILE *fp;
        fp = fopen(filename, "r");
        if (fp == NULL) {
                printf("\n     Unable to open input file.\n\n");
                helpmssg();
                exitmssg();
        }
  while ((c=getc(fp)) != EOF){
                ungetc (c,fp);
                if (fscanf(fp,"%d\n", &c) == 1) {
                        arr[i] = c;
                        i++;n++;
                }
        }

//      int arr[] = {64, 34, 25, 12, 22, 11, 90};
        sort(arr, n,d);
        printf("Sorted array: \n");
        printArray(arr, n);

        outputfile = argv[2];
        fp = fopen(outputfile, "r");
                if (fp != NULL ) {
                        printf("\n     Output file already exists, would you like to overwrite it?: Y/N  \n\n");
                        scanf("%c", &conf);
                                if (conf == 'N' || conf == 'n') {
                                        helpmssg();
                                        exitmssg();
                                } else {printf("     Overwritting...\n\n");}
                }
        fclose(fp);
        fp = fopen(outputfile, "w");
                for (i=0; i < n; i++) {
                        fprintf(fp,"%d\n",arr[i]);
                }
        exitmssg();
}

2 个答案:

答案 0 :(得分:1)

你可以做到

for(i=0; i<size ; ++i)
{
    if( fscanf(fp, "%d", &arr[i])!=1 )
    {
        printf("\nSomething went wrong.");
        break;
    }
}

其中size是数组中存储的数字的数量。

使用fscanf()逐行读取每行中的整数。它返回成功分配的数量,在这种情况下,在循环的每次迭代中应该是1

在你的程序中,首先使用getc(),它读取一个字符,然后使用fscanf(),只读取其余字符。

答案 1 :(得分:0)

while (getc(fp) != EOF)更改为while ((c = getc(fp)) != EOF)

在循环中和if语句之前在其下方添加ungetc (c, fp);

if (fscanf(fp,"%d", &c) == 1) {更改为if (fscanf(fp,"%d\n", &c) == 1) {