2015-02-17 101 views
0
#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; 
    } 

} 

文件我想讀的是:如何使用fread和緩衝從C++文件中讀取文件?

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

我想被存儲在變量天,這是數組的塔尺寸,以及陣列中其他部分的第一,但它讀取一切只是最後一個號碼。 每個號碼都在一個新行中。我可以改變一下嗎?我正在考慮最後一個條件。謝謝

+0

除了'使用命名空間標準;'醜陋的一些cout,問題不是C++,請標記它C – 2015-02-17 20:49:34

+0

在C++中,我建議使用'std :: istream :: read'到一個'std :: vector '或者'std :: string'。您可以使用'std :: istringstream'來讀取矢量,就好像矢量是輸入流一樣。不需要您使用動態內存。 – 2015-02-17 20:51:55

+0

在「從文件整數讀取C++」或「從文件數組讀取C++」中搜索StackOverflow。 – 2015-02-17 20:53:47

回答

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是可選的 - 主要是存在,表明我們期望我們讀到的第一個數字來匹配我們從閱讀其他項目的數量文件。