none
la methode de CIniFile qui ne compile pas RRS feed

  • Question

  • Bonjour,

    Dans la méthode de CIniFile, j'ai plusieurs problèmes de compilation. Je vous met la méthode et les Erreurs :

    	erc CIniFile::WriteString( System::String^ sSectionName, System::String^ sKeyName, System::String^ sStrValue)
    	{
    		try
    		{
    			//A variable to hold the fetched line in wstring format
    			System::String^ sLine;
    			//A variable to hold the position of the searched character
    			unsigned int iPos;
    			//A variable to indicate whether the section in the input parameter is found
    			bool bSectionFound = false;
    			//A variable to indicate whether the section in the input parameter is found
    			bool bKeyFound = false;
    			//Handle to open the INI file in read mode
    			std::wifstream hInFile;
    			//Handle to open the INI file in write mode
    			std::wofstream hOutFile;
    			//List to hold all the sections and keys in the INI file
    			List< System::String^>^ sListIni;
    			//A variable to hold the position of the searched character
    			unsigned int iKeyPos;
    
    			//Close the INI file that is opened in the constructor
    			if( CWfStream::is_open())
    			{
    				CWfStream::close();
    			}
    			//Open the INI file in read mode, loop till the end and insert each
    			//line into the list. Close the INI file after the entire file is read.
    			const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( m_sFileName)).ToPointer();
    			wchar_t* tmp = (wchar_t*)chars;
    			Marshal::FreeHGlobal(IntPtr((void*)chars));
    			char* str = CStrConv::awcstombs( tmp);
    			hInFile.open( (char*)str,  666);
    			CStrConv::StrFreeA( str);
    			//If the INI file is not open then return FAILURE
    			if (!hInFile.is_open())
    			{
    				return FAILURE;
    			}
    			while (!hInFile.eof())
    			{
    			CWfStream::getline( (FILE*)hInFile, sLine);
    			if( !sLine->Empty)
    			{
    				sListIni->Add( sLine);
    			}
    			hInFile.close();
    			chars = (const wchar_t*)(Marshal::StringToHGlobalUni( m_sFileName)).ToPointer();
    			tmp = (wchar_t*)chars;
    			Marshal::FreeHGlobal(IntPtr((void*)chars));
    			str = CStrConv::awcstombs( tmp);
    			hOutFile.open( (char*)str,  666);
    			CStrConv::StrFreeA( str);
    			//Open the INI file in the write mode
    			//If the INI file is not open then return FAILURE
    			if (!hOutFile.is_open())
    			{
    				return FAILURE;
    			}
    			System::String^ pListIni;
    			for each( pListIni in sListIni)
    			{
    				//Check whether the string is a section that is required. If yes, then set the variable to true
    				hOutFile << pListIni << endl;
    				if( pListIni == (L"[" + sSectionName + L"]"))
    				{
    					bSectionFound = true;
    					sListIni->Insert( pListIni, sKeyName + L"=" + sStrValue);
    					//Check whether the fetched string is a key that is required. If yes,
    					//then change its value and assign it back to the list and break out
    					//of the while loop.
    					iPos = pListIni->IndexOf(sKeyName);
    					iKeyPos = pListIni->IndexOf(L"=");
    					if(	( iPos != std::wstring::npos) && (sKeyName.size() == iKeyPos))
    					{
    						pListIni->Empty;
    						pListIni = sKeyName + L"=" + sStrValue;
    						bKeyFound = true;
    					}
    					else
    					{
    						//If the string is not the required key, then ensure that it is not
    						//the beginning of another section. If it is another section, and
    						//the required key is not found within the given section, insert the
    						//given key and its value into the list before the beginning of the
    						//next section. After inserting the value into the list, decrement
    						//the iterator so that the pointer will point to the beginning of
    						//the inserted line to print it in the INI file.
    						iPos = pListIni->find(L"[");
    						if (iPos != System::String^::npos)
    						{
    							if (!bKeyFound)
    							{
    								sListIni.insert( pListIni, sKeyName + L"=" + sStrValue);
    							}
    						}
    					}
    					hOutFile << pListIni << endl;
    				}
    				hOutFile << pListIni << endl;
    			}
    			//If the given section itself is not found then, write the section into the
    			//INI file
    			if (!bSectionFound)
    			{
    				hOutFile << "[" << sSectionName <<  "]" << endl;
    				hOutFile << sKeyName << "=" << sStrValue << endl;
    			}
    			hOutFile.close();
    			//Open the INI file in read write mode
    			CWfStream::open( m_sIniFileName.c_str(), L"w+", 666);
    			return SUCCESS;
    		}
    		catch(...)
    		{
    			return FAILURE;
    		}
    	}//End of WriteString method
    

    et les erreurs:

    1>..\..\..\..\Utility\IniFileManager\src\IniFile.cpp(416): error C2440: 'cast de type' : impossible de convertir de 'std::wifstream' en 'FILE *'
    1>          Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    1>..\..\..\..\Utility\IniFileManager\src\IniFile.cpp(438): error C2679: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'System::String ^' (ou il n'existe pas de conversion acceptable)
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(679): peut être 'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [trouvé à l'aide d'une recherche dépendante d'un argument]
    1>          with
    1>          [
    1>              _Elem=wchar_t,
    1>              _Traits=std::char_traits<wchar_t>
    1>          ]
    


    Jean Noël Martin

    samedi 25 juillet 2015 12:47

Réponses

Toutes les réponses

  • >CWfStream::getline( (FILE*)hInFile, sLine);

    C'est quoi ce cast tout pourri ?

    C'est quel méthode que vous cherchez à appeler ??

    Réfléchissez à ce que vous faites.


    Paul Bacelar, Ex - MVP VC++

    samedi 25 juillet 2015 19:52
    Modérateur
  • J'ai retiré le cast et le message est devenu

    1>..\..\..\..\Utility\IniFileManager\src\IniFile.cpp(416): error C2664: 'SpecificationLoader::CWfStream::getline' : impossible de convertir le paramètre 1 de 'std::wifstream' en 'FILE *'
    1>          Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé

    je cherche a appeler la methode CWfStream::getline

    déclarée comme:

    static erc CWfStream::getline( FILE* pFile, System::String^ sLine);


    Jean Noël Martin


    • Modifié JeanNoel53 dimanche 26 juillet 2015 00:32
    dimanche 26 juillet 2015 00:29
  • Changez le type de "hInFile" en "FILE *"  et la manière dont il est utilisé.

    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 dimanche 26 juillet 2015 21:06
    dimanche 26 juillet 2015 10:08
    Modérateur