Фактически, метод ExecuteScalar возвращает первый столбец первой строки возвращаемого DataSet. В вашем случае вы делаете только Insert, вы на самом деле не запрашиваете никаких данных. Вам нужно запросить scope_identity () после того, как вы вставите (это синтаксис SQL Server), и тогда вы получите ответ. См. Здесь:
EDIT: Как отметил Майкл Харен, вы упомянули в своем теге, что используете MySql, используйте last_insert_id (); вместо scope_identity ();
Используйте getline () для чтения первой строки, затем начните читать остальную часть потока.
ifstream stream("filename.txt");
string dummyLine;
getline(stream, dummyLine);
// Begin reading your stream here
while (stream)
...
(Измененный на станд.:: getline (благодарит dalle.myopenid.com))
Вы могли использовать проигнорировать функцию потока:
ifstream stream("filename.txt");
// Get and drop a line
stream.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
// Get and store a line for processing.
// std::getline() has a third parameter the defaults to '\n' as the line
// delimiter.
std::string line;
std::getline(stream,line);
std::string word;
stream >> word; // Reads one space separated word from the stream.
while( someStream.good() ) // !someStream.eof()
{
getline( someStream, line );
cout << line << endl;
}
Это перестало работать потому что: При чтении последней строки это не читает маркер EOF. Таким образом, поток все еще хорош, но больше нет данных, оставленных в потоке читать. Таким образом, цикл повторно введен. станд.:: getline () затем пытается считать другую строку из someStream и сбоев, но все еще записать строку в станд.:: суд.
Простое решение:while( someStream ) // Same as someStream.good()
{
getline( someStream, line );
if (someStream) // streams when used in a boolean context are converted to a type that is usable in that context. If the stream is in a good state the object returned can be used as true
{
// Only write to cout if the getline did not fail.
cout << line << endl;
}
}
Правильное решение: while(getline( someStream, line ))
{
// Loop only entered if reading a line from somestream is OK.
// Note: getline() returns a stream reference. This is automatically cast
// to boolean for the test. streams have a cast to bool operator that checks
// good()
cout << line << endl;
}
Назовите getline () однажды для выбрасывания первой строки
существуют другие методы, но проблема - это, Вы не знаете, какой длины первая строка будет, делают Вас? Таким образом, Вы не можете пропустить его, пока Вы не знаете, где это сначала '\n'. Если бы однако Вы действительно знали, сколько времени первая строка была, Вы могли просто искать мимо нее, то начать читать, это будет быстрее.
Так, чтобы сделать это первый путь посмотрел бы что-то как:
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
// Open your file
ifstream someStream( "textFile.txt" );
// Set up a place to store our data read from the file
string line;
// Read and throw away the first line simply by doing
// nothing with it and reading again
getline( someStream, line );
// Now begin your useful code
while( !someStream.eof() ) {
// This will just over write the first line read
getline( someStream, line );
cout << line << endl;
}
return 0;
}
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
char buffer[256];
ifstream myfile ("test.txt");
// first line
myfile.getline (buffer,100);
// the rest
while (! myfile.eof() )
{
myfile.getline (buffer,100);
cout << buffer << endl;
}
return 0;
}
этот код может считать файл из Вашей указанной строки из файла, но Вы имеете к make-файлу в файловом менеджере перед рукой, мое имя файла является "временным" кодом, дан ниже
https://надежда i.stack.imgur.com/OTrsj.png
, которой это может помочь