2017-01-18 12 views
0

Для проекта, над которым я работаю, я пытаюсь читать целые числа из текстового файла. В этом случае, они отформатированы как переменные, такие как U = 220В, так что я пытаюсь читать после знака равенства в V. Это код, который я придумал:Чтение целых чисел из текстового файла

if (word[0] == 'U') { 

       //declaring variables for checking for certain letters 
       char v = 'V'; 
       char m = 'm'; 
       char M = 'M'; 

       //taking in integer for voltage 
       while (word[i] != v) { 
        volt = volt + word[i]; 
        i++; 
       } 
       cout << volt << endl; 

В В тестовом случае есть три значения U = 200 В, U = 220 В и U = 22000 мВ (m - миллилитры и будут обработаны позже с другой функцией), случайным образом вставленные в файл. При тестировании я получаю вывод:

Первый выход правильный. Во втором и третьем случаях, как представляется, они теряют число в первую очередь, а в третьем случае он добавил еще один ноль в конце. Первоначально я думал, что это просто отбрасывая первое значение, я изменил строку кода

volt = volt + word[i]; 

в

volt = volt + word[i-1]; 

, чтобы увидеть, какое значение он будет читать до значения первоначально первого чтения. В этом случай, он сделал то, что я ожидал бы, чтобы это сделать, если это работало должным образом, с выходом в формате:

=200 
=200 
=20000m 

есть ли ошибка в логике моего кода, что я с видом здесь?

РЕДАКТИРОВАТЬ: При попытке отладки далее я переместил окончательную линию печати извне цикла while внутрь, чтобы увидеть, что цикл выводит шаг за шагом. Похоже, что он начинается с 2 и продолжает добавлять от 0 до конца каждую итерацию до окончания 200 000 м.

+1

std :: getline имеет перегрузку, которая сделает расщепление на = простое. Поместите текст после символа = в строковый поток и прочитайте целое число. Чтение остановится на первом не целочисленном символе, например на V. Затем прочитайте этот персонаж. – user4581301

ответ

1

Похоже, что проблема была связана со значениями для i и вольта, не сбрасываемыми после каждой итерации. Чтобы это исправить, я добавил строки кода:

volt = ""; 
i = 2; 

(я настроен на 2 в этом случае пропустить оригинальный V и = при разборе через) Затем я снова запустил программу, вывод значений для проверки, и теперь отображаются правильные значения. Таким образом, весь блок кода, обновленный, теперь выглядит следующим образом:

while (myfile >> word) { 

     volt = ""; 
     i = 2; 

     //printing out words (remove) 
     cout << word << endl; 

     //checking for U in words 
      if (word[0] == 'U') { 

       //declaring variables for checking for certain letters 
       char v = 'V'; 
       char m = 'm'; 
       char M = 'M'; 

       //taking in integer for voltage 
       while (word[i] != v) { 
        volt = volt + word[i]; 
        i++; 
        //cout << volt << endl; 
       } 
       cout << volt << endl; 
0

Что вы имеете в своем коде? Эта строка: "volt = volt + word [i];" - просто возьмите 2 кол-кода ASCII-кода с номером «2» (это 50) и 1 счетчик «0» (это 48). Затем я получаю результат: 50 + 50 + 48 = 148. Я изменил этот код. Вот! Но используются функции AnsiString и StrToInt.

int volt=0, i=2; 
char word[20] = "U=220V\0"; 
AnsiString String; 

if(word[0] == 'U'){ 

    //declaring variables for checking for certain letters 
    char v = 'V'; 
    char m = 'm'; 
    char M = 'M'; 

    while(word[i] != v){ 
     //volt = volt + word[i]; 
     String += word[i]; 
     i++; 
     } 
    //cout << volt << endl; 
    volt = StrToInt(String); 
    }