我正在尝试使用2d数组读取CSV文件,但是读取存在问题。文件的第一个单元格将被跳过,然后继续读取所有内容。我不明白为什么它不读取第一个单元格。
#include<iostream>
#include<fstream>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string arrival,job[3][4];
ifstream jobfile("myfile.csv");
std::string fileCommand;
if(jobfile.is_open())
{
cout << "Successfully open file"<<endl;
while(getline(jobfile,arrival,','))
{
for(int i=1;i < 4;i++) //i = no. of job
{
for(int j=0; j<4; j++) // j = no. of processes
{
getline(jobfile,job[i][j],',');
cout << "Job[" << i << "]P[" << j << "]: "<< job[i][j]<< endl;
}
}//end for
}//end while
}//end if for jobfile open
jobfile.close();
}
答案 0 :(得分:1)
更改此:
for(int i=1;i < 3;i++)
对此:
for(int i=0;i < 3;i++)
另外,请删除此getline(jobfile,job[i][j],',');
,因为这样会跳过一行。在while循环的条件下调用getline时,它已经读取了一行(因此,现在必须存储该行。然后,当while循环的条件再次被求值时,将读取下一行)。
但是,它变得比这复杂得多,因为您arrival
一次将持有一个令牌,直到遇到当前行的最后一个令牌。在这种情况下,arrival
将是这样:"currentLineLastToken\nnextLineFirstToken"
。
由于这个原因,您需要专门处理到达包含换行符的情况,为此请使用string::find
。
找到换行符后,应将该字符串拆分为该换行符,以提取所涉及的两个标记。为此,请使用string::substr
。
此外,您不应该在while循环内循环使用双精度来存储令牌,您只需阅读即可。仅在退出读取文件的while循环之后,才需要打印job
时使用double for循环。
将所有内容放在一起,我们得到了:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string arrival,job[3][4];
ifstream jobfile("myfile.csv");
std::string fileCommand;
if(jobfile.is_open())
{
cout << "Successfully open file"<<endl;
int i = 0, j = 0;
while(getline(jobfile,arrival,','))
{
//cout << "|" << arrival << "|" << endl;
size_t found = arrival.find("\n");
if (found != std::string::npos) // if newline was found
{
string lastToken = arrival.substr(0, found);
string nextLineFirstTOken = arrival.substr(found + 1);
job[i++][j] = lastToken;
j = 0;
if(nextLineFirstTOken != "\n") // when you read the last token of the last line
job[i][j++] = nextLineFirstTOken;
}
else
{
job[i][j++] = arrival;
}
}//end while
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 4; ++j)
{
cout << job[i][j] << " ";
}
cout << endl;
}
}//end if for jobfile open
jobfile.close();
}
输出(用于我的自定义输入):
Successfully open file
aa bb cc dd
bla blu blo ble
qq ww ee rr