5
A
回答
1
讀取第一個整數。跳到字符串的後面並跳過數字。然後從這一點讀取一個int。中間的部分是字符串。可能不是100%正確的,但:
char buf[256], *t = buf, *p, str[256];
fread(buf, 1, 256, file);
int s,e;
t += sscanf(buf, "%d", &s);
*p = buf + strlen(buf);
while (isdigit(*p)) p--;
sscanf(p, "%d", &e);
strncpy(str, p, p - t);
5
我會先讀出行並將第一個和最後一個單詞轉換爲整數。鬆散:
std::string line;
std::getline(infile, line);
size_t ofs_front = line.find(' ');
size_t ofs_back = line.rfind(' ');
int front = std::strtol(line.substr(0, ofs_front).c_str(), NULL, 0);
int back = std::strtol(line.substr(ofs_back).c_str(), NULL, 0);
std::string text = line.substr(ofs_front, ofs_back - ofs_front);
你必須做一些修改,以擺脫空間(如增加偏移吞噬所有空格),你應該添加了很多錯誤檢測的。
如果你想正常化所有內部裏面的文字空間,那麼還有另一種解決方案使用字符串流:
std::vector<std::string> tokens;
{
std::istringstream iss(line);
std::string token;
while (iss >> token) tokens.push_back(token);
}
// process tokens.front() and tokens.back() for the integers, as above
std::string text = tokens[1];
for (std::size_t i = 2; i + 1 < tokens.size(); ++i) text += " " + tokens[i];
1
這並不像@ KerrekSB的solution一樣高效,但另一種方式來做到這一點是提取第一個整數,然後遍歷字符串的其餘部分,直到找到第二個整數。
#include <iostream>
#include <sstream>
int main()
{
std::istringstream ss("100 4 words to discard 200");
int first, second;
char buf[1000] = {0};
if(!(ss >> first)) {
std::cout << "failed to read first int\n";
return 1;
}
while(!(ss >> second) || !ss.eof()) {
if(ss.eof()) {
std::cout << "failed to read second int\n";
return 1;
}
ss.clear();
if(ss.getline(buf, 1000, ' ').bad()) {
std::cout << "error extracting word\n";
return 1;
}
}
std::cout << "first = " << first << "\n";
std::cout << "second = " << second << "\n";
return 0;
}
+0
@KerrekSB這兩種情況都可以正確處理 – Praetorian
+0
對不起,沒關係! –
相關問題
- 1. 閱讀空格分隔的整數
- 2. 條碼閱讀器與c整合#
- 3. 閱讀與sscanf空格字符串
- 4. 閱讀文件條空白
- 5. 閱讀整數用C
- 6. 閱讀整數值
- 7. 閱讀失敗,空格
- 8. 閱讀整個數據與Golang net.Conn.Read
- 9. 閱讀條形碼與NFC
- 10. 如何閱讀與空間
- 11. 如何閱讀與空間
- 12. 讀整數與空格分開轉換成int []數組
- 13. 整合ZXing條碼閱讀器在symbian
- 14. 閱讀CSV與空間使用pandas.read_csv
- 15. 用javascript讀一條線
- 16. 閱讀整數和JAVA
- 17. 閱讀加整數VB
- 18. 閱讀整數,在C++
- 19. 閱讀整數浮點
- 20. 閱讀整數矩陣(C++)
- 21. 閱讀整數說明
- 22. 讀整數序列與未知線FORTRAN
- 23. 讀取一條線的整數成二維陣列
- 24. 閱讀C中的空格字符串
- 25. Bash Zenity空格形式 - 閱讀輸入
- 26. 閱讀整個消息與bufio.NewReader(conn)
- 27. 與fgets不讀完整線用C
- 28. 一字一句的閱讀,包括以下空格
- 29. 閱讀TIFF柵格數據
- 30. 閱讀半格式數據
一次讀取一行,您可以構建一個子字符串解析器,然後您可以使用各種任意終止符來枚舉這些段。 Kerrek的答案很好,但如果你需要經常做這類事情,而且你需要一個通用的高效工具,那麼我發現這種方法對我們來說最合適 – Mordachai