如何使用fread和buffering从C ++文件中读取文件?

时间:2015-02-17 20:48:01

标签: c++ file io fread

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

FILE *in, *out;

using namespace std;

int main(int argc, char** argv)
{
    in = fopen("share.in", "r");
    int days;
    int size;
    int offset = 0;
    fscanf(in, "%d", &days);

    fseek(in, 0L, SEEK_END);

#if defined(_WIN32)
    size = ftell(in) - 1;
#elif defined (_WIN64)
    size = ftell(in) - 1;
#else
    size = ftell(in);
#endif // defined

    fseek(in, 0L, SEEK_SET);

    char *buffer = (char*) malloc(size + 1);
    char *token;

    fread(buffer, 1, size, in);
    buffer[size] = '\n';

    int *values = (int*) malloc(days * sizeof(int));
    int i;

    while (*buffer != '\n'){
        buffer++;
    }

    buffer++;
    cout << days << endl;
    cout << endl;

    for (i = 0; i < days; i++){
        values[i] = 0;

        while (*buffer != '\n'){
            values[i] = (values[i] * 10) + (*buffer - '0');
            buffer++;
        }

        buffer++;
    }
    for (int i = 0; i < days; i++){
        cout << values[i] << endl;
    }

}

我想读的文件是:

20 
10 
7
19
20
19
7
1
1
514
8
5665
10
20
17
16
20
17
20
2
16

我希望第一个存储在变量天数中,该变量天数是数组的大小,其余部分存储在数组中,但它会读取除最后一个数字之外的所有内容。 每个号码都在新行中。 我可以更改哪些内容?我在思考最后一段时间的情况。谢谢

1 个答案:

答案 0 :(得分:4)

如果您要编写C ++,请将其编写为C ++。我做的工作是这样的:

std::ifstream in("share.in");

int days;
in >> days;

std::vector<int> data { std::istream_iterator<int>(in),
                        std::istream_iterator<int>() };

assert(days == data.size());

对于真实代码,assert是可选的 - 主要是为了表明我们希望我们读取的第一个数字与我们从文件中读取的其他项目的数量相匹配。