当我在visual studio中运行此代码时,我得到正确的输出:正确的输出如下:
但是当我在hopper(unix)中运行相同的代码时,我得到一些奇怪的输出.. 它看起来像这样:
代码如下:
//#include <mysql.h>
#include <iomanip>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <conio.h>
using namespace std;
int main()
{
//connect= mysql_init(&mysql);
//connect= mysql_real_connect(&mysql,SERVER,USER,PASSWORD,DATABASE,0,0,0);
cout<<endl;
ifstream inFile;
ofstream outFile;
inFile.open("team.txt");
if (inFile.fail())
{
cout<<" ***ERROR*** File not found ***ERROR*** "<<endl;
//exit(1);
}
else
{
string sqlQuery2;
int numOfLines=0;
while(!inFile.eof())
{
numOfLines++;
string line;
getline(inFile,line) ;
int y = line.length();
string nums,city,conf,name;
int count=0;
for(int x=0;x<y;x++)
{
if(line[x]!=':' && count==0)
{
nums+=line[x];
}
else if(line[x]!=':' && count==1)
{
city+=line[x];
}
else if(line[x]!=':' && count==2)
{
conf+=line[x];
}
else if(line[x]!=':' && count==3)
{
name+=line[x];
}
else if (line[x]==':')
{
count++;
}
}
sqlQuery2="INSERT INTO team VALUES ("+nums+",'"+city+"','"+conf+"','"+name+"');";
cout<<sqlQuery2<<endl;
//mysql_query(connect,sqlQuery2.c_str());
}
}
inFile.close();
_getch();
return 0;
}
答案 0 :(得分:2)
我认为问题在于你的输入文件team.txt是在Windows机器上创建的。它有DOS风格的行结尾。
如果您添加支票
else if (line[x]=='\r')
{
// Ignore the character
}
在非Windows机器上输出应该没问题。
建议改进
使用
while(!inFile.eof())
{
充满了问题。有关详细信息,请参阅Why is iostream::eof inside a loop condition considered wrong?。
替换块:
while(!inFile.eof())
{
numOfLines++;
string line;
getline(inFile,line) ;
通过
string line;
while(getline(inFile,line))
{
numOfLines++;
答案 1 :(得分:2)
看起来你已经违反了行尾。在Windows行结束\r\n
(&#34;回车&#34;,&#34;换行&#34;),在Unix中,他们只有\n
。
这意味着line
字符串的末尾,您有回车符。
您的代码目前正在将此回车符放入name
变量,然后将其添加到sqlQuery2
字符串中。当您输出该值时,回车符将光标移动到当前行的开头并开始覆盖输出。
一种解决方案是修复您的数据文件。您可以使用dos2unix实用程序,或者有许多其他方法。有关详细信息,请参阅此SO帖子enter link description here。你也可能改变你把它放到你的unix系统上的方式,(ftp可以自动改变它)。
如果您不想这样做,可以添加代码以在\r
字符串中查找line
并忽略它。