2017-01-29 5 views
0

Код ниже - функция чтения файлов для моей программы планирования задач. Все в порядке, пока он не попытается прочитать последовательность чисел (ex 1, 2, 3, 4, 5), представляющую крайние сроки. Вместо ints в таблицу «Сроки» добавляются некоторые случайные числа. Кто-нибудь знает решение этой проблемы?Fscanf не читает ожидаемые значения из последней строки файла (C/C++)

#include <iostream> 
    #include <vector> 
    #include <cstdlib> 
    #include <fstream> 
    #include <map> 
    #include <time.h> 
    using namespace std; 
    class Task{ 
     public: 
      string Name; 
      int Number; 
      int Operation_Time_Machine_One; 
      int Operation_Time_Machine_Two; 
      int Task_Deadline; 
    }; 
    int Maximum_Time_Between_IDE; 
    int IDE_Duration; 
    int Read_File(){ 
     string FileName= ""; 
     cout << "Please enter file name (with .txt):\t"; 
     cin >> FileName; 
     std::vector<Task> Task_Vector; 
     FILE* OpenedFile = fopen(FileName.c_str(),"r"); 
     int Number_Of_Tasks=0; 
     int Duration_Of_Operation_One =0; 
     int Duration_Of_Operation_Two =0; 
     if(OpenedFile == NULL){ 
      exit(EXIT_FAILURE); 
     } 
     else{ 
       fscanf(OpenedFile,"%d", &Number_Of_Tasks); 
       for (int i=0; i<= Number_Of_Tasks;i++){ 
        Duration_Of_Operation_One=0; 
        Duration_Of_Operation_Two=0; 
        fscanf(OpenedFile, "%d, %d", &Duration_Of_Operation_One, &Duration_Of_Operation_Two); 
        Task New_task; 
        New_task.Name ="task" ; 
        New_task.Number = (i+1); 
        New_task.Operation_Time_Machine_One = Duration_Of_Operation_One; 
        New_task.Operation_Time_Machine_Two = Duration_Of_Operation_Two; 
        New_task.Task_Deadline =0; 
        Task_Vector.push_back(New_task); 
       } 
       fscanf(OpenedFile,"%d", &Maximum_Time_Between_IDE); 
       fscanf(OpenedFile,"%d", &IDE_Duration); 
       int Deadlines[Number_Of_Tasks]; 
//from now it's gettig weird 
       for(int i=0; i<=Number_Of_Tasks;i++){ 
        fscanf(OpenedFile,"%d, ", &Deadlines[i]); 
       } 
       for(int i=0; i<=Number_Of_Tasks;i++){ 
        cout<<Deadlines[i]<<endl; 
       } 
     } 
     fclose(OpenedFile); 

     return 0; 
    } 
    int main() 
    { 
     clock_t time; 
     time = clock(); 
     std::cout << "Hello world!" << std::endl; 
     Read_File(); 
     time = clock() - time; 
     printf ("Time of algorithm %f seconds.\n",((float)time)/CLOCKS_PER_SEC); 
     return 0; 
    } 

ввода пробы:

5 
74, 64 
27, 74 
69, 47 
35, 54 
101, 86 
102 
6 
113, 242, 344, 144, 513 
+2

Вы отправили слишком много нерелевантного кода. Создайте MVCE http://stackoverflow.com/help/mcve – DyZ

+0

'fscanf()' возвращает значение, указывающее успех. Код имеет некоторые проблемы с вводом -> проверьте возвращаемое значение 'fscanf()'. – chux

+0

Как вы сказали, я проверил, и когда он попадает в цикл, у файла есть код ошибки msvcrt! _iob + 95? –

ответ

2

Есть некоторые ошибки ..

int Deadlines[Number_Of_Tasks]

VLA-х лет не допускаются в C++. Поэтому вы должны удалить тег C++ или использовать std::vector везде, где хотите VLA. т.е. std::vector<int> Deadlines(Number_Of_Tasks);

for(int i=0; i <= Number_Of_Tasks; i++)

.... Deadlines[i] 

вы превышая пределы массива, что приводит к непредсказуемому поведению. То, что вы хотите сделать, это (в обоих последних двух петель):

for(int i=0; i < Number_Of_Tasks; i++) 
       ^^^ 

Наконец, не объединить C и C++, которые являются двумя различными языками программирования. Выберите одну из них для своей программы и придерживайтесь ее.

+0

Это решение! Так тебя! –

+1

@AnnaTiko, это предпочтительное поведение, чтобы пометить ответ как правильный ответ, чем сделать только комментарий об этом. Пожалуйста, отметьте это, так как это позволит продолжить игру StackOverflow. Это позволит вашему респонденту заработать очки репутации и быть выбранным в качестве хорошего ответчика. –

Смежные вопросы