2010-04-27 103 views
6

我正在嘗試讀取返回分隔文件。充滿了短語。如何從 n分隔文件中讀取字符串

我試圖把每個短語放入一個字符串。

的問題是,當我嘗試用

fscanf(file,"%50s\n",string); 

讀取文件中的字符串只包含一個字。當它碰到一個空格時,它會停止讀取字符串

回答

2

fscanf可以修改爲讀取過去的空格。細節有點複雜。下面是該男子頁說,關於什麼樣%[...]

匹配的從指定的一組 接受字符 字符的非空序列;下一個指針 必須是指向char的指針,並且 必須有足夠的空間用於字符串中的所有 字符,再加上終止NUL字符的 。通常的 跳過領先的空格是 壓制。該字符串將被設置爲 (或不在) 特定集合中的字符;該組由 定義,其中開放的 括號[character和接近的 括號]字符之間的字符。如果第一個 字符在開括號後面是一個 ,那麼該組不包括 這些字符。爲了在該組中包括一個接近的 支架,使其成爲第一個 字符後的開放支架或 的迴音;任何其他位置 將結束設置。連字符 字符 - 也是特殊的;當 放置在另外兩個字符之間時, 它將所有干預字符添加到 的集合中。要包含連字符,請在最後一個字符 右括號之前使其成爲 。例如, `[^] 0-9-]'表示除了括號之外的所有東西 ,零到 九和連字符''。字符串結尾 ,但在字段寬度不足時(或帶有回調,在)集 中出現字符而不是 。

因此,%[^ \ n]應該讀取所​​有回車符。

+2

它可以讀取換行符的所有內容,但* *不是*換行符本身。如果你在'fscanf(file,「%[^ \ n]」)循環,你會一直得到空字符串。您需要使用格式化字符串中的空白符或類似'%* c'的換行符。 – 2010-04-27 04:05:12

+0

謝謝,就是這樣。 – 2010-04-27 04:06:08

+0

@Adam好點。上面接受的答案對緩衝區溢出錯誤也更安全。 – 2010-04-27 05:35:14

3

fscanf%s在發現空白時停止讀取。

既然你正在閱讀的格式文本,你可以簡單地使用fgets,其內容直到填滿你給它的緩衝區,它發現一個換行符(\n),或在到達最終的文件,以先到者爲準。

+0

這很奇怪。它不會讀取每一行。並且每個字符串代替以\ 0結尾以\ n結尾 – 2010-04-27 04:04:44

+1

每個字符串仍以「\ 0」結尾,但之前的最後一個字符通常是「\ n」,因爲它讀取的行與它完全相同出現在文件中。如果缺少'\ n'',那麼它意味着您的緩衝區不夠大,不能滿足整行的要求,或者您只是讀取文件中的最後一個字符,並且沒有用換行符結束。 – caf 2010-04-27 04:45:53

5
fscanf(file,"%50[^\n]\n",string); 
  1. 除了\n每個人的性格會[^\n]

  2. 最大0F 50個字符消耗將被消耗(確保字符串有51 ATLEAST空間)

  3. ..\n",string這確保\n也被消耗,使得ne xt調用不只是返回一個空字符串。

+0

這個效果很好,謝謝 – 2010-04-27 04:05:34

2

Avoid using scanf.如前所述,您應該使用fgets來代替。

如果您不想使用固定大小的緩衝區並允許任意長度的行,則可以嘗試使用Chuck Falconer's public domain ggets function。 (該鏈接似乎是下降的權利,但archive.org has a copy。)

+0

@ Zeikoder:哇,你經歷了麻煩,downvote任何提及'ggets'的帖子?無論如何,無論您認爲CBFalconer的理智如何,您都應該判斷代碼,而不是作者。如果你對'ggets'實現有特別的抱怨,那麼公平就夠了,但我認爲只因爲你不喜歡這個人就會失去公平感。 – jamesdlin 2011-01-09 03:42:57

-1

intially使用Payload_ID 00 01 02 03 .... 10

使用

的char * PCHAR = 「」 發送數據; //用於字符串捕獲。

fprintf(fp1,「%s」,strtok(pChar,「Payload_ID」));

+0

這裏Payload_ID是你可以指定的分隔符 – 2017-05-04 06:20:03