【问题标题】:Reading numbers from a file into an array in C将文件中的数字读入C中的数组
【发布时间】:2014-09-23 06:29:28
【问题描述】:

我对 C 很陌生,我正在尝试编写一个程序,该程序读取一个包含许多二进制整数的文件,并以相反的顺序打印出整数。 测试文件中的整数是: 200 300 -145629 67 11111111 -1 8000 0

整数是使用另一个文件的二进制输出写入的,因此您通常无法读取该文件。 这是我到目前为止的代码:

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h> #include <sys/types.h>

int main(int argc, char *argv[]){ 
    int *integers; 
    char *file; 
    int fd; 
    struct stat fileStat; 
    int value; 
    int i; 

    if(argc != 2){ 
        fprintf(stderr, "usage: intrev <input file> <output file>\n");
        exit(1); 
    } 

    file = argv[1]; 
    fd = open(file, O_RDONLY); 
    if(fd < 0){ 
        fprintf(stderr, "error opening file\n"); 
        exit(1); 
    }

    if(fstat(fd, &fileStat) < 0){ 
        fprintf(stderr, "error getting file size\n"); 
        exit(1); 
    } 

    integers = malloc(fileStat.st_size * sizeof(int)); 

    for(i = 0; i < fileStat.st_size; i++){ 
        value = read(fd, integers + i, sizeof(int)); 
        if(value == -1){ 
            fprintf(stderr, "error reading file\n"); 
            exit(1); 
        } 
    } 

    for(i = fileStat.st_size - 1; i >= 0; i--){ 
        printf("%d\n", *integers + i); 
    } 

    if(close(fd) != 0){ 
        fprintf(stderr, "error closing file -- quitting\n"); 
        exit(1); 
    } 

    return(0); 
}

我需要使用 fstat 和 malloc() 来设置数组大小。 该程序编译时没有错误,但运行时,我得到数字 231 到 200,如下所示: 231 230 229 . . . 201 200

我有什么不正确的地方?非常感谢任何帮助。

【问题讨论】:

  • *integers + i优先级的问题。

标签: c arrays file


【解决方案1】:

这一行

    printf("%d\n", *integers + i); 

等价于

    printf("%d\n", integers[0] + i); 

由于运算符优先级。

你可以使用:

    printf("%d\n", *(integers + i)); 

    printf("%d\n", integers[i]); 

【讨论】:

    【解决方案2】:

    for(i = fileStat.st_size - 1; i >= 0; i--){ 
            printf("%d\n", *integers + i); 
        } 
    在这些行中,我认为您正在取消整数,而不是添加 i 的值,它实际上是从同一位置读取并在其中添加 i,而 i 在每次迭代中都会递减。 所以更正这个以从整数+ i 中读取而不是从 de reffer 中读取。 我是一名 C++ 程序员,所以我没有给出任何代码,但我指出了我认为的逻辑错误。 希望这会有所帮助。 如果有帮助,请将此评价为答案。

    【讨论】:

      【解决方案3】:

      您分配的数组比相关文件大。您的“malloc”应该分配“filestat.st_size”字节,从而为“filestat.st_size / sizeof(int)”元素腾出空间。

      您对“read()”操作的错误处理是错误的引用: 如果当前文件偏移量位于或超过文件末尾,则不读取任何字节,并且“read()”返回零。

      尝试修复这些...

      您当然也应该修复 R. Sahu 指出的错误

      【讨论】:

        【解决方案4】:

        请尝试以下代码

        #include <stdio.h>
        main()
        {
        
            FILE *file;
            myFile = fopen("Somenumbers.txt", "r");
        
            //read file into array
            int numberArray[16];
            int i;
        
            for (i = 0; i < 16; i++)
            {
                fscanf(file, "%1d", &numberArray[i]);
            }
        
            for (i = 0; i < 16; i++)
            {
                printf("Number is: %d\n\n", numberArray[i]);
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2013-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-16
          • 2020-01-20
          • 2010-09-29
          相关资源
          最近更新 更多