c - 从文件中读取数字并将其分配给 C 中的数组时遇到问题

标签 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();
}

最佳答案

你可以做

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

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

使用fscanf()将每一行中的整数一一读取。它返回成功分配的数量,在本例中,在循环的每次迭代中应为 1

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

关于c - 从文件中读取数字并将其分配给 C 中的数组时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48739179/

相关文章:

在c中将int转换为字节数组

在 C 编程中比较两个文件以匹配行

c - 如何只用cmake编译c?

c - 读取文件并保存为矩阵

batch-file - 批量打开用户文件夹内的文件夹(c :\users\usernamehere\my documents)?

hadoop - 从 hadoop 中的多个 reducer 写入单个文件

c - 将 ncurses 窗口保持在前台

java - 检查 boolean 数组中是否存在元素

ios - Swift 2D 数组扩展

c - 从文件中读取,atoi() 仅在第一个元素上返回零