2013-07-29 129 views
0

我試圖通過套接字發送plist文件中的內容。 userPlistifstream並將文件打開正確,因爲它應該。但是當它運行時,它只會通過套接字發送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) - 終止null從哪裏來的第一次? –

+0

@MartinJames對不起,我不知道你的意思。 – jamespick

+2

在C中,字符串必須以'\ 0'結尾。你對字符串strlen()使用C函數。它將計算它在找到'\ 0'之前找到的字符數。你永遠不會在你的C字符串(plistChar)中放入一個'\ 0',所以各種不好的東西都可能發生。另外,由於您的循環終止條件,您正在爲一個C++字符串編制索引。它可能純粹運氣有'\ 0',但它也是未定義的行爲。 – DanielKO

回答

1

建議:如果你的文件停止第一行後讀那麼我的猜測是,它與while循環的問題 - 你檢查,看看是否while循環執行一次以上?在調試器中使用斷點來執行此操作。我不認爲函數getline()是一個有效的條件檢查,但它是值得檢查

+0

只執行兩次 – jamespick

+0

但它掛在while循環 – jamespick

+0

我不知道你的意思了第二位。你的代碼片段中有一個while循環。你是說在第二次while循環迭代程序沒有結束或意外結束。或者,你說你的程序進入一個無限循環的第二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