diff --git a/src/fileFormats/ensight/read/ensightReadFile.C b/src/fileFormats/ensight/read/ensightReadFile.C index c2b0d4c4ca070f56a77d5b4836b117bef3a78fda..22c7a2bae8a750e62ca1e474b930de0091afdce9 100644 --- a/src/fileFormats/ensight/read/ensightReadFile.C +++ b/src/fileFormats/ensight/read/ensightReadFile.C @@ -2,8 +2,10 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | www.openfoam.com \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -54,25 +56,37 @@ Foam::Istream& Foam::ensightReadFile::read(string& value) { if (format() == IOstream::BINARY) { - char buf[80]; + auto& iss = stdStream(); + + // Binary string is *exactly* 80 characters + value.resize(80, '\0'); + iss.read(&value[0], 80); - read(reinterpret_cast<char*>(buf), sizeof(buf)); + if (!iss) + { + // Truncated - could also exit here, but no real advantage + value.erase(iss.gcount()); + } - string strBuf(value); + // Truncate at the first embedded '\0' + auto endp = value.find('\0'); - const size_t iEnd = strBuf.find('\0', 0); - if (iEnd == string::npos) + if (endp != std::string::npos) { - value = buf; + value.erase(endp); } - else + + // May have been padded with trailing spaces - remove those + endp = value.find_last_not_of(" \t\f\v\n\r"); + + if (endp != std::string::npos) { - value = strBuf.substr(0, iEnd - 1); + value.erase(endp + 1); } } else { - value = ""; + value.clear(); while (value.empty() && !eof()) { getLine(value); diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C index 05dc8d5bb935995f36740d32e667adb5036d2623..ce95050bfaf9c445d1e93406dc85588f5cf620ec 100644 --- a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C +++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C @@ -2,8 +2,10 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd. + \\ / A nd | www.openfoam.com \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -99,23 +101,23 @@ void Foam::ensightSurfaceReader::readGeometryHeader(ensightReadFile& is) const // Ensight Geometry File is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Description - 1 is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Node info is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Element info is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Part is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Part number label ibuffer; @@ -124,11 +126,11 @@ void Foam::ensightSurfaceReader::readGeometryHeader(ensightReadFile& is) const // Description - 2 is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; // Coordinates is.read(buffer); - DebugInfo<< "buffer: " << buffer << nl; + DebugInfo<< "buffer [" << buffer.length() << "] " << buffer << nl; } @@ -278,29 +280,30 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() streamFormat_ = IOstream::BINARY; { - istream& is = isBinary.stdStream(); + istream& iss = isBinary.stdStream(); - char buffer[80]; - is.read(buffer, 80); + // Binary string is *exactly* 80 characters + string buf(size_t(80), '\0'); + iss.read(&buf[0], 80); - char test[80]; - label nChar = 0; - for (label i = 0; i < 80; ++i) + if (!iss) { - if (buffer[i] == '\0') - { - break; - } - test[i] = buffer[i]; - nChar++; + // Truncated? + buf.erase(iss.gcount()); } - string testStr(test, nChar); + // Truncate at the first embedded '\0' + const auto endp = buf.find('\0'); + if (endp != std::string::npos) + { + buf.erase(endp); + } + // Contains "C Binary" ? if ( - (testStr.find("binary", 0) == string::npos) - && (testStr.find("Binary", 0) == string::npos) + (buf.find("binary") == std::string::npos) + && (buf.find("Binary") == std::string::npos) ) { streamFormat_ = IOstream::ASCII; @@ -352,8 +355,7 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() // Read faces - may be a mix of tris, quads and polys DynamicList<face> faces(ceil(nPoints/3)); DynamicList<Tuple2<string, label>> schema(faces.size()); - string faceType = ""; - label nFace = 0; + string faceType; while (is.good()) // (is.peek() != EOF) { is.read(faceType); @@ -363,20 +365,22 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() break; } - DebugInfo - << "faceType: " << faceType << endl; + label nFace = 0; if (faceType == "tria3") { is.read(nFace); - const label np = 3; - for (label faceI = 0; faceI < nFace; ++faceI) + DebugInfo + << "faceType <" << faceType.c_str() << "> count: " + << nFace << nl; + + face f(3); + for (label facei = 0; facei < nFace; ++facei) { - face f(np); - for (label fpI = 0; fpI < np; fpI++) + for (label& fp : f) { - is.read(f[fpI]); + is.read(fp); } faces.append(f); @@ -386,13 +390,16 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() { is.read(nFace); - const label np = 4; - for (label faceI = 0; faceI < nFace; ++faceI) + DebugInfo + << "faceType <" << faceType.c_str() << "> count: " + << nFace << nl; + + face f(4); + for (label facei = 0; facei < nFace; ++facei) { - face f(np); - for (label fpI = 0; fpI < np; fpI++) + for (label& fp : f) { - is.read(f[fpI]); + is.read(fp); } faces.append(f); @@ -402,17 +409,21 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() { is.read(nFace); + DebugInfo + << "faceType <" << faceType.c_str() << "> count: " + << nFace << nl; + labelList np(nFace); - for (label faceI = 0; faceI < nFace; ++faceI) + for (label facei = 0; facei < nFace; ++facei) { - is.read(np[faceI]); + is.read(np[facei]); } - for (label faceI = 0; faceI < nFace; ++faceI) + for (label facei = 0; facei < nFace; ++facei) { - face f(np[faceI]); - for (label fpI = 0; fpI < f.size(); ++fpI) + face f(np[facei]); + for (label& fp : f) { - is.read(f[fpI]); + is.read(fp); } faces.append(f); @@ -423,11 +434,10 @@ const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry() if (debug) { WarningInFunction - << "Unknown face type: " << faceType - << ". Aborting read and continuing with current " + << "Unknown face type: <" << faceType.c_str() + << ">. Stopping read and continuing with current " << "elements only" << endl; } - break; } schema.append(Tuple2<string, label>(faceType, nFace)); diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C index 0275d48231e3fb57f5f7d57bf6a21cd118c8e1b1..b56ce103a3e47514508e42878dfc012de5f251bc 100644 --- a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C +++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C @@ -111,10 +111,11 @@ Foam::tmp<Foam::Field<Type>> Foam::ensightSurfaceReader::readField if (primitiveType != pTraits<Type>::typeName) { - FatalIOErrorInFunction(is) - << "Expected " << pTraits<Type>::typeName << "values " - << "but found type " << primitiveType - << exit(FatalIOError); + IOWarningInFunction(is) + << "Expected '" << pTraits<Type>::typeName + << "' values but found type " << primitiveType << nl + << " This may be okay, but could also indicate an error" + << nl << nl; } scalar value;