2013-07-29 3 views
0

Я пытаюсь отправить содержимое файла plist через сокет. userPlist - это ifstream, и файл открывается правильно и как следует. Но когда он запускается, он только отправляет bplist00? через сокет, а затем останавливается. Почему это так? Вот мой исходный код:Файл C++ останавливает чтение после первой строки

if (userPlist.is_open()) { 
    string line; 
    int i; 
    int sizeOfPlist; 
    char plistChar[128]; 
    while (getline(userPlist, line)) {      
     sizeOfPlist = line.size(); 
     for (i = 0; i <= sizeOfPlist; i++) 
     { 
      plistChar[i] = line[i]; 
     } 
     line = "\0"; 
     send(sock, plistChar, strlen(plistChar), 0); 
     for (i = 0; i < 128; i++) { 
      plistChar[i] = '\0'; 
     } 
     send(sock, "\n", strlen("\n"), 0); 
    } 
} 

Если у кого-то есть предложения или советы, это было бы здорово. Спасибо.

+0

strlen (plistChar) - где заканчивается нулевой отказ от первого раза? –

+0

@MartinJames Извините, я не знаю, что вы имеете в виду. – jamespick

+2

В C строки должны быть завершены '\ 0'. Вы используете функцию C для строк, strlen(). Он посчитает, сколько символов он найдет, прежде чем нажать «\ 0». Вы никогда не кладете '\ 0' в свою строку C (plistChar), поэтому могут возникать всевозможные плохие вещи. Также вы индексируете строку C++ один за другим из-за условия завершения цикла. Он может иметь «\ 0» по чистой удаче, но это также неопределенное поведение. – DanielKO

ответ

1

Предложение: Если ваш файл перестает читать после первой строки, то я предполагаю, что это проблема с вашим циклом while. Вы проверили, выполняется ли цикл while более одного раза? Для этого используйте точки останова в отладчике. Я не думаю, что GetLine() является допустимым условный чек, но это стоит проверить

+0

Он выполняет только два раза – jamespick

+0

Но он зависает во втором цикле – jamespick

+0

Я не уверен, что вы имеете в виду. У вас есть один цикл в фрагменте кода. Вы говорите, что на второй итерации цикла цикл не заканчивается или неожиданно заканчивается. Или вы говорите, что ваша программа переходит в бесконечный цикл во второй цикл while (возможно, тот, который вы не показываете нам) Сколько раз вы ожидаете итерации через цикл while? – user2202911

1
  1. Ваш цикл выполняется дополнительное время, потому что вы используете <= вместо <:

    for (i = 0; i <= sizeOfPlist; i++) 
    //   ^^ 
    
  2. pListChar не завершается нулевым действием к моменту его отправки в сокет. Вам нужна эта строка:

    pListChar[sizeOfPlist] = '\0'; 
    
    send(sock, plistChar, strlen(plistChar), 0); 
    

    Вам также не нужно line = "\0";.

+0

. файл имеет нулевые символы, но спасибо за ответ – jamespick

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