В моей школе мне дали небольшую библиотеку для выполнения некоторых проектов. Библиотека была написана с учетом потребностей Linux, поэтому я пытаюсь изменить некоторые вещи для работы с моим компилятором MinGW. Одна конкретная программа предназначена для чтения файлов по URL. Мне пришлось изменить stat на _stat, чтобы он работал правильно. Открытие файла работает нормально, но _stat, похоже, возвращает неправильное значение. Я включу соответствующий код ниже:
#ifdef WIN32
#define stat _stat
#endif
//return true if the number of chars read is the same as the file size
bool IsDone() const
{
cout << "checking if numRead " << numRead << " is fileSize " << fileSize << endl;
return (numRead == fileSize);
}
char Read()
{
if (IsDone())
throw IllegalStateException("stream is done");
else
{
char c;
file.get(c);
cout << "reading: " << c << endl;
if (file.fail())
throw FileException(std::string("error reading from file ") + fileName);
++numRead;
return c;
}
}
void OpenFile(string fileName)
{
struct stat buf;
#ifdef WIN32
if (_stat(fileName.c_str(), &buf) < 0){
switch (errno){
case ENOENT:
throw FileException(std::string("Could not find file ") + name);
case EINVAL:
throw FileException(std::string("Invalid parameter to _stat.\n"));
default:
/* Should never be reached. */
throw FileException(std::string("Unexpected error in _stat.\n"));
}
}
#else
if (stat(fileName.c_str(), &buf) < 0)
throw FileException(std::string("could not determine size of file ") + fileName);
#endif
fileSize = buf.st_size;
file.open(fileName.c_str());
}
Если вы хотите просмотреть всю библиотеку, вы можете получить их из здесь . Я понимаю, что код выглядит грубо; Я просто пытаюсь забить рабочую версию Windows. Эта вещь отлично работает в Linux; проблема заключается в том, что когда я читаю файл в Windows, размер равен 1 сокращению для каждой новой строки, которую я использую во входном файле, так что если у меня есть файл, который выглядит следующим образом:
text
Работает нормально, но с:
text\r\n
Он ломается, и вывод выглядит так:
checking if numRead 0 is fileSize 6
checking if numRead 0 is fileSize 6
reading: t
checking if numRead 1 is fileSize 6
checking if numRead 1 is fileSize 6
reading: e
checking if numRead 2 is fileSize 6
checking if numRead 2 is fileSize 6
reading: x
checking if numRead 3 is fileSize 6
checking if numRead 3 is fileSize 6
reading: t
checking if numRead 4 is fileSize 6
checking if numRead 4 is fileSize 6
reading:
checking if numRead 5 is fileSize 6
checking if numRead 5 is fileSize 6
reading:
File Error: error reading from file H:/test/data/stuff.txt
Это прерывается, потому что IsDone () ложно возвращает false (без каламбура), и программа пытается прочитать после конца файла. Любые предложения о том, почему _stat возвращает неправильный номер, когда есть новая строка?