2013-08-01 5 views
2

Вот мой код.C++ ifstream skips 1-я строка

#include <iostream> 
#include <fstream> 
#include <cstdlib> 

using namespace std; 

int main (){ 
    ifstream inFile; 

    char date1[8], date2[8]; 
    int dayTemp1[24], dayTemp2[24]; 

    inFile.open("weatherdata.txt"); 
     if(inFile.fail()){ 
     cout << "File failed to open."; 
     exit(1); 
    } 

    inFile >> date1 >> date2; 


    cout << date1 << endl; 
    cout << date2 << endl; 

inFile.close(); 

return 0; 
} 

Первые две строки файла weatherdata.txt являются:
01/04/13
01/05/13


date1 должен содержать первую дату но при печати он печатает только символ «\ n» (пустая строка). Я не знаю, что происходит с кодом, почему он пропускает первую строку даты. Любая помощь приветствуется. Я начинаю с C++.

+1

Используйте 'std :: string', и проблема пойдет. – Nawaz

+0

меняет дату1 [8] на сегодняшний день1 [9] помощь ?? – Saksham

ответ

1

использование станд :: строка вместо:

#include <string> 
std::string date1; 
std::string date2; 
//... 

inFile >> date1 >> date2; 

ИЛИ

std::getline(inFile, date1); 
std::getline(inFile, date2); 
+0

даже 'inFile >> данные1 >> дата2' будет работать. +1 в любом случае. – Nawaz

+0

Спасибо, что это работает. Но мне было интересно, почему infile >> date1 >> date2 не работал с моим исходным кодом. – aveleon

+0

дата2 при распечатке, распечатайте правильную дату. date1 при печати, распечатанном \ n просто интересно, почему он пропускал первое свидание. Я чувствую, что мне не хватает чего-то очевидного. – aveleon

0

@billz дал вам решение проблемы, поэтому я приведу объяснение:

Проблема было то, что ваши массивы char выделяли ровно 8 байтов (или символов в этом случае), но не оставили места для обязательного нулевого байта (\0). Мое предположение заключается в том, что это вызывает неопределенное поведение, и когда вы печатаете, из-за этого вы не получаете правильный результат. Например, на Linux я не получаю первую строку, как пустой, я на самом деле получить:

01/04/1301/05/13
01/05/13

Это было ясный индикатор для меня, что вставка не прекращалась, когда она достигла предполагаемого нулевого байта. Решение состоит в том, чтобы позволить вашим массивам символов удерживать не менее байтов.

Использование std::string полезно в этом контексте, поскольку оно полностью устраняет эту проблему (это контейнер с динамически размерной строкой). Его размер будет сопровождать дополнительные символы (а также нулевой байт).

+0

Я знаю, что это очень поздно, но спасибо – aveleon

+0

@ user2640557 Без проблем! Рад, что смог помочь! :) – 0x499602D2