Tout d'abord, je sais qu'il ya des messages avec des problèmes similaires, mais je ne trouve pas la solution à la mienne dans l'un d'entre eux.Accéder à la violation de lecture de l'emplacement en utilisant le fichier binaire
Il s'agit d'une affectation de programmation utilisant des fichiers binaires et des fichiers texte pour stocker les données de vente d'entreprise. (Nom de division, trimestre et ventes), puis pour rechercher des enregistrements spécifiés dans le fichier de données binaires et les afficher.
Voici les parties importantes de mon code:
#include stuff
...
// Struct to hold division data
struct DIVISION_DATA_S
{
string divisionName;
int quarter;
double sales;
};
int main()
{
...
// Open the data file
fstream dataFile;
dataFile.open(dataFilePath, ios::in | ios::out | ios::binary);
... Get data from user, store in an instance of my struct ...
// Dump struct into binary file
dataFile.write(reinterpret_cast<char *>(&divisionData), sizeof(divisionData));
// Cycle through the targets file and display the record from divisiondata.dat for each entry
while(targetsFile >> targetDivisionName)
{
int targetQuarter; // Target quarter
string targetQuarterStr;
targetsFile.ignore(); // Ignore the residual '\n' from the ">>" read
getline(targetsFile, targetQuarterStr);
targetQuarter = atoi(targetQuarterStr.c_str()); // Parses into an int
cout << "Target: " << targetDivisionName << " " << targetQuarter << endl;
// Linear search the data file for the required name and quarter to find sales amount
double salesOfTarget;
bool isFound = false;
while (!isFound && !dataFile.eof())
{
cout << "Found division data: " << targetDivisionName << " " << targetQuarter << endl;
DIVISION_DATA_S divisionData;
// Read an object from the file, cast as DIVISION_DATA_S
dataFile.read(reinterpret_cast<char *>(&divisionData), sizeof(divisionData));
cout << "Successfully read data for " << targetDivisionName << " " << targetQuarter << endl
<< "Name: " << divisionData.divisionName << ", Q: " << divisionData.quarter << ", "
<< "Sales: " << divisionData.sales << endl;
// Test for a match of both fields
if (divisionData.divisionName == targetDivisionName && divisionData.quarter == targetQuarter)
{
isFound = true;
cout << "Match!" << endl;
salesOfTarget = divisionData.sales;
}
}
if (!isFound) // Error message if record is not found in data file
{
cout << "\nError. Could not find record for " << targetDivisionName
<< " division, quarter " << targetQuarter << endl;
}
else
{
// Display the corresponding record
cout << "Division: " << targetDivisionName << ", Quarter: " << targetQuarter
<< "Sales: " << salesOfTarget << endl;
totalSales += salesOfTarget; // Add current sales to the sales accumulator
numberOfSalesFound++; // Increment total number of sales found
}
}
Désolé pour l'absence de tiret pour la boucle while, copier/coller type de foiré.
Mon problème apparaît lorsque j'essaie d'accéder aux informations lues dans le fichier binaire. Par exemple, quand il essaie d'exécuter l'instruction cout
j'ai ajouté pour le débogage, il me donne cette erreur:
Unhandled exception at 0x0FED70B6 (msvcp140d.dll) in CorporateSalesData.exe: 0xC0000005: Access violation reading location 0x310A0D68.
Maintenant, ce que j'ai lu, il semble que cela signifie quelque chose essaie de lire tout Les régions basses de mémoire, AKA quelque chose a quelque chose à faire avec un pointeur nul, mais je ne peux pas imaginer comment cela apparaîtrait. Toute cette opération de lecture est copiée exactement à partir de mon manuel, et je n'ai aucune idée de ce qu'est un reinterpret_chast
, encore moins comment cela fonctionne ou comment corriger les erreurs avec. S'il vous plaît aider?
EDIT: Merci pour toute l'aide. Pour éviter les complications ou utiliser quelque chose que je ne comprends pas complètement, je vais passer à un c-string pour le divisionName.
Avez-vous essayé parcourant le code dans un débogueur? – rrirower
La lecture et l'écriture des octets d'un 'std :: string' (ou de la plupart des objets de classe légèrement compliqués) ne fonctionnent pas. Vous devez écrire la valeur de chaque élément séparément (ou utiliser un paquet de sérialisation). –
Conseil général: Évitez d'utiliser 'reinterpret_cast' sauf si vous devez absolument absolument l'utiliser dans un but particulier. –