我在调试下面的代码时遇到问题。我在visual studio中得到了正确的输出,

时间:2015-10-30 03:15:22

标签: c++

当我在visual studio中运行此代码时,我得到正确的输出:正确的输出如下:

correct output

但是当我在hopper(unix)中运行相同的代码时,我得到一些奇怪的输出.. 它看起来像这样:

wrong output

代码如下:

//#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;
    }

2 个答案:

答案 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并忽略它。