2010-11-24 3 views
2

У меня есть следующий цикл for, выполняемый в моей программе, и я не вижу, как его дизайн коррелирует с результатом, который я получаю.My for loop выполняет больше времени, чем ожидается

cout << no_of_lines << endl; 
for (int count = 0; count < no_of_lines + 1; count ++) 
{ 
    getline(Device, line, '='); 
    cout << line << endl; 
} 

Это выход:

3 
DeviceName 
GPU 
Manufacturer 
Intel 
GraphicalRam 
128MB 

И это файл DeviceList

DeviceName=GPU 
Manufacturer=Intel 
GraphicalRam=128MB 

В цикле, no_of_lines относится к количеству строк в файле, в этом случае 3. Я предоставил этот вывод в качестве проверки, что цикл выполняется только один раз в строке. Может ли кто-нибудь сказать мне, почему этот цикл выполняется больше раз, чем ожидалось? Я предполагаю, что из-за моего включения = в качестве разделителя и что цикл каким-то образом выполняет дополнительное время до приращения, но тогда почему он останавливается на разделителе на последней строке, требуя, чтобы я добавил 1 в цикл ограничение?

+0

Согласно http: //www.cplusplus.com/reference/iostream/istream/getline/ваш код должен читать `DeviceList.getline (строка, 255, '=');`. Я что-то упускаю? – Mikhail 2010-11-24 03:19:40

+0

Этот вывод не соответствует коду и входу. Есть что-то еще, что вы не показываете нам. Нам нужен компилируемый пример, который при запуске показывает проблему. Готов поспорить, что когда вы сделаете этот пример, вы исправите свою собственную проблему. – 2010-11-24 03:20:09

+0

@Mikhail: Нет. Существует std :: getline(), который принимает поток, строку и разделитель, и это то, что вы должны (обычно) использовать (ваша версия требует, чтобы строки были меньше размера буфера и были больны если это не так) см. http://www.cplusplus.com/reference/string/getline/ – 2010-11-24 03:22:21

ответ

5

Этот http://www.cplusplus.com/reference/string/getline/ ваш друг здесь. В документации говорится, что когда символ delem передается в getline, он считывает до уровня delem char, или достигается конец файла. '\ n' не обрабатывается по-разному. Когда он найдет delem char, он отбрасывает его и заполняет строку независимо от того, что она читала до этого момента. В следующий раз, когда вы вызываете getline, он продолжает читать, откуда он ушел. поэтому в этом случае каждый вызов читается следующим образом.

DeviceName 
GPU\nManufacturer 
Intel\nGraphicalRam 
128MB\n 

'\ n' в приведенной выше строке является в основном символом новой строки. это не обратная косая черта, за которой следует n (2 символа). его единственный символ новой строки '\ n'. Просто для понимания я использовал его таким образом.

Для наглядности здесь приведен полный код (скомпилированный и протестированный).

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int no_of_lines = 3; 
    string line; 
    cout << no_of_lines << endl; 
    for (int count = 0; count < no_of_lines + 1; count++) 
    { 
     getline(cin, line, '='); 
     cout << line << endl ; 
    } 
    return 0; 
} 

К настоящему времени я надеюсь, что это ясно для вас, почему вам нужно позвонить getline 4 раза.

0

Вы хотите, чтобы он считался трижды, но ваша петля насчитывает 0,1,2,3,4, т.е. 5 итераций.

4

Ваша петля выполняет no_of_lines+1 раз.

Я предполагаю, что разделитель должен быть равен '='. Однако, когда разделитель равен '=', то \n не является разделителем. Следовательно, line будет содержать \n (скажем, на втором getline). И поэтому количество отображаемых строк не равно количеству циклов, выполняемых циклом.

1

Когда вы используете = в качестве разделителя строк, \n is не используется как разделитель строк.

Итак, вы получаете строки , содержащие символы новой строки.

Когда вы выводите такую ​​строку, она представляется как две или более строк (из-за новых строк, которые она содержит).

Приветствия & НТН.,

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