为什么文本和 csv 文件在读取时行为不可预测,在 C++ 中?
Why do text and csv files act unpredictably when reading, in c++?
我正在使用 C++,我必须处理 txt/csv 个文件。行基本上是记录,字段用逗号分隔。首先,我读取文件并将其存储为 myPoints,然后调用函数计算每个字段的模式,最后调用每个数据块的模式。
它工作正常,我很确定该算法工作正常,但问题是它不会以相同的方式处理相同的文件,即当将每条记录存储在 myPoints 中时,有时它读取最后一个字段有一个额外的字符和如果我在同一个文件中剪切和粘贴相同的数据,有时问题会解决,有时则不会。
我真的不知道这里出了什么问题,所以我无法修复它。这个额外的字符给我带来了很多麻烦,因为我无法正确计算模式。
有什么见解吗?
下面的代码是 MPI 项目的一部分,每个进程都从这里的同一个文件中读取其正确的数据块,此外,如您所见,我正在使用 ifstream 和 stringstream 来读取和处理文件:
unordered_map < int , unordered_map <int , vector<string> > > storeMyShareOfLines(string fileName , int rank , int numPointsLocal){
string line;
ifstream myfile(fileName,ios::in);
vector<string> point;
unordered_map < int , unordered_map <int , vector<string> > > myPoints;
int start_line = rank * numPointsLocal;
int end_line = start_line + numPointsLocal;
if(!myfile.is_open()){
cout<<"Failed to open"<<endl;
exit(0);
}
int j = 0;
int myShare = 0;
int line_counter = 0;
while (getline(myfile, line))
{
if( myShare <= numPointsLocal)
{
if(start_line <= line_counter && line_counter < end_line)
{
myShare++;
stringstream sline(line);
string word;
while (getline(sline , word , ','))
{
point.push_back(word);
}
myPoints[rank][j] = point;
j++;
point.clear();
line_counter++;
}
else
{
line_counter++;
}
}
else
{
return myPoints;
myfile.close();
}
}//While
}
我注意到,如果我用“LibreOffice/Excel”打开 csv 文件并在我拥有的最后一列数据之后立即手动删除一些空列,问题就会解决。虽然我仍然不知道幕后的确切原因。
希望对遇到同样问题的人有所帮助。
我正在使用 C++,我必须处理 txt/csv 个文件。行基本上是记录,字段用逗号分隔。首先,我读取文件并将其存储为 myPoints,然后调用函数计算每个字段的模式,最后调用每个数据块的模式。 它工作正常,我很确定该算法工作正常,但问题是它不会以相同的方式处理相同的文件,即当将每条记录存储在 myPoints 中时,有时它读取最后一个字段有一个额外的字符和如果我在同一个文件中剪切和粘贴相同的数据,有时问题会解决,有时则不会。
我真的不知道这里出了什么问题,所以我无法修复它。这个额外的字符给我带来了很多麻烦,因为我无法正确计算模式。
有什么见解吗?
下面的代码是 MPI 项目的一部分,每个进程都从这里的同一个文件中读取其正确的数据块,此外,如您所见,我正在使用 ifstream 和 stringstream 来读取和处理文件:
unordered_map < int , unordered_map <int , vector<string> > > storeMyShareOfLines(string fileName , int rank , int numPointsLocal){
string line;
ifstream myfile(fileName,ios::in);
vector<string> point;
unordered_map < int , unordered_map <int , vector<string> > > myPoints;
int start_line = rank * numPointsLocal;
int end_line = start_line + numPointsLocal;
if(!myfile.is_open()){
cout<<"Failed to open"<<endl;
exit(0);
}
int j = 0;
int myShare = 0;
int line_counter = 0;
while (getline(myfile, line))
{
if( myShare <= numPointsLocal)
{
if(start_line <= line_counter && line_counter < end_line)
{
myShare++;
stringstream sline(line);
string word;
while (getline(sline , word , ','))
{
point.push_back(word);
}
myPoints[rank][j] = point;
j++;
point.clear();
line_counter++;
}
else
{
line_counter++;
}
}
else
{
return myPoints;
myfile.close();
}
}//While
}
我注意到,如果我用“LibreOffice/Excel”打开 csv 文件并在我拥有的最后一列数据之后立即手动删除一些空列,问题就会解决。虽然我仍然不知道幕后的确切原因。
希望对遇到同样问题的人有所帮助。