gpt4 book ai didi

c++ - 使用 istringstream 丢失随机字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:40 25 4
gpt4 key购买 nike

我正在将文本文件的行读入变量 myline,然后尝试使用 istringstream 对这些行进行标记。但是,我似乎丢失了原始文本文件字符串中的随机字符。

cout<< myline << buff << flush; //print original text file line
istringstream iss(myline);
string sub;
while (iss >> sub) {
cout << "[" << sub << "]" << endl;
}

如果您查看我的输出,您可以看到我从文本文件中获得了正确的字符串,但是当我使用 istringstream 然后打印单个标记(在 [] 括号内看到)时,一些标记被过早截断.

#include <iostream>
[#include]
[<iostream]
#include <sstream>
[#include]
[<sstream>]
using namespace std;
[using]
[namespace]
[st]

int main()
[int]
[main(]
{
string str(" SOME LONG STRING\twith\nSPACES ");
[string]
[str("]
[SOME]
[LONG]
[STRING\twith\nSPACES]

istringstream iss(str);
[istringstream]
[iss(str);]

string s;
[strin]
while (iss >> s) {
[while]
[(iss]
[>>]
cout << "[" << s << "]" << endl;
[cout]
[<<]
["["]
[<<]
[s]
[<<]
["]"]
[<<]
[e]
}
return 0;
[retur]
}

有人知道我做错了什么吗?提前致谢!

编辑:这是一个可以完全编译的代码版本。您可以使用任何文本文件运行它

#include <cstring>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

class MyFileReader {

public:
//constructor
MyFileReader(const char* p);

//destructor
~MyFileReader();

//getLine()
int getLine(char *buffer, int size);

//getCurrentLineNumber()
int getCurrentLineNumber();

void tokenizeLine(vector<string>& vec);

FILE * pFile;

};

//constructor
MyFileReader::MyFileReader(const char* p) {
pFile = fopen(p, "r");
}

//destructor
MyFileReader::~MyFileReader() {
fclose(pFile);
}

//getLine()
int MyFileReader::getLine(char *buffer, int size){
char *out = fgets(buffer, size, pFile);
if (out==NULL) {
return -1;
}
char *pch = strpbrk(out,"\n");
if (pch != NULL) {
return 1;
}
else {
return 0;
}

}

int MyFileReader::getCurrentLineNumber() {
static int mynumber=2;
return mynumber++;
}

//tokenizeLine
void MyFileReader::tokenizeLine(vector<string>& vec) {
string myline("");
char buff[10];
while (1) {
int result = getLine(buff, sizeof(buff));
if (result == -1 ) {
if (myline.length() > 0)
cout << myline << flush;
break;
}
else if (result == 0) {
myline += buff;
}
else if (result == 1) {
cout<< myline << buff << flush;
istringstream iss(myline);
string sub;
while (iss >> sub) {
cout << "[" << sub << "]" << endl;
}
myline = "";
}
else {
printf("PANIC");
}
}
return;
}

int main(int argc, char **argv) {
vector<string> v;

const char *filename = argv[1];
MyFileReader f(filename);
f.tokenizeLine(v);
return 0;

}

为了生成上面的输出,我运行了它:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
string str(" SOME LONG STRING\twith\nSPACES ");

istringstream iss(str);

string s;
while (iss >> s) {
cout << "[" << s << "]" << endl;
}
return 0;
}

最佳答案

错误在这里:

else if (result == 1) {
cout<< myline << buff << flush;
istringstream iss(myline);
string sub;
while (iss >> sub) {
cout << "[" << sub << "]" << endl;
}
myline = "";
}

如果result == 1 ,这意味着 buff 包含 \n , 这并不意味着它 包含\n . IE。如果缓冲区包含 \n,则删除缓冲区.因此,如果该行恰好有 n*10 (sizeof buffer) 个字符,则您的代码有效,否则,一行的最后一个字符不会复制到 myline。但下降了。

快速解决方法是:

    else if (result == 1) {
myline += buff; // copy the rest of the line into `myline`
cout<< myline << flush; // buff now is part of myline
istringstream iss(myline);
string sub;
while (iss >> sub) {
cout << "[" << sub << "]" << endl;
}
myline = "";
}

尽管您可能要考虑删除 \n来自缓冲区,例如:

int MyFileReader::getLine(char *buffer, int size){
char *out = fgets(buffer, size, pFile);
if (out==NULL) {
return -1;
}
//char *pch = strpbrk(out,"\n");
char *pch = strchr(out,'\n'); // no need to search for a string
if (pch != NULL) {
*pch = '\0'; // drop the '\n'
return 1;
}
else {
return 0;
}

}

您必须更改 cout<< myline << flush;cout<< myline << endl; , 不过。


除了这个错误,请考虑使用ifstream :

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main()
{
ifstream file("test.txt");
if(!file)
{
/* error */
}else
{
string line;
while(getline(file, line))
{
istringstream iss(line);

string s;
while (iss >> s) {
cout << "[" << s << "]" << endl;
}
}
}
}

关于c++ - 使用 istringstream 丢失随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16368051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com