如何获取文件中的元素数量?

时间:2012-11-23 17:44:08

标签: c command-line args

现在,我有

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Invalid number of command line parameters, exiting...\n");
        exit(1);
    }

    int *numReadings;
    load_readings(argv[1], numReadings);

    return 0;
}

    int *load_readings(char fileName[], int *numReadings) {
        FILE *in = NULL;
        in = fopen(fileName, "r");

        if (in == NULL) {
            printf("Unable to open a file named \"%s\", exiting...\n", fileName);
            fclose(in);
            exit(4);
        }

        printf("%s\n", fileName);
        int size = atoi(fileName);
        printf("Size is %d\n", size);
        int *data = (int *) calloc(size, sizeof(int));

        int i;
        for (i = 0; i < size; i++)
            fscanf(in, "%d", (data + i));
        }
    }

当我做size = atoi(fileName)它返回0.在包括这个的多个站点上,我看到人们做“atoi(argv [1])”但我的不断返回0.我的sample.txt文件有一堆由空格分隔的3位数字。我的印象是,一旦我正确地确定了尺寸,它下面的所有其他东西都会起作用。

3 个答案:

答案 0 :(得分:1)

atoi没有告诉size,只是将string转换为integer
了解size文件,您需要寻求文件的结尾然后询问职位:

    fseek(fp, 0L, SEEK_END); // seek to end of file
    size = ftell(fp);    //get current file pointer
   fseek(f, 0, SEEK_SET); // seek back to beginning of file

答案 1 :(得分:0)

atoi(string_value)仅在string_value可以转换为整数时返回数字,例如int size = atoi("1");size的值将为1。但是如果int size = atoi("asd");,则值为0,因为asd无法转换为整数

如果您想获取文件大小,可以使用struct stat

答案 2 :(得分:0)

atoi()将字符串转换为整数,看起来您想知道文件大小,或者具体地说,如果数据看起来与123 123 123...完全相同,则文件必须分配多少个数字? -digit用空格分隔的数字,然后用stat()返回文件的大小,以字节为单位,你可以除以4:

struct stat st;
/* find the file size in bytes */
/* should check for errors */
fstat(fileName, &st);

/* divide the number of bytes by 4 to get the number of numbers */
int size = st.st_size / 4; 

/* just in case the last number doesn't have a space */
size += (st.st_size % 4) != 0; 

/* allocate memory  */
int *data = calloc(size, sizeof(int));

注意:我真的不喜欢这个解决方案,你应该分配一个初始缓冲区,说100个整数,如果你需要更多,你应该使用realloc()