- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序来读取数据并将数据写入数据文件。出于某种原因,我无法弄清楚,它无法从文件中读取字符,只有名称和数字名称。我需要字符,以便显示项目列表。
文件中的数据是一条记录,struct是this,获取char时出错。
struct Data
{
char Genre;
string Productname;
int Numberofproducts;
int Numberofproductsleft;
int Numberofproductssold;
bool Morethantwo;
bool Noticeseen;
float price;
};
//Lists genre to choose from
string listofgenres[] = {"1) Book", "2) Movie", "3) Other", "4) Delete Entry" };
这是我命名为 input 的 void 函数中的代码,它将数据写入文件。这是一本书,还有其他三个选项,这就是为什么他们有一个字符来标识数据是什么类型。
Data put;
int choice;
string genrechosen;
ofstream F;
int count = 0;
cout<<"What genre is the item? (Type the option or enter 1,2, or 3): "<<endl;
while(count < logs)
{
cout<<listofgenres[count]<<endl;
count++;
}
cin >> genrechosen;
genrechosen = validate(genrechosen, 'I');
if(genrechosen == "1" || genrechosen == "Books" || genrechosen == "books" || genrechosen == "Book" || genrechosen == "book" || genrechosen == "B" || genrechosen == "b")
{
F.open(filename, ios::out|ios::app|ios::binary);
put.Genre = '~';
cout<<"What is the name of the book: "<<endl;
cin >> put.Productname;
cout<<"How many "<<put.Productname<<" do you have: "<<endl;
cin >> put.Numberofproducts;
neg(put.Numberofproducts);
cout<<"How much are you selling "<<put.Productname<<" for? (If you don't know , just put 0. Don't put a $): "<<endl;
cin >> put.price;
neg(put.price);
put.Numberofproductssold = 0;
put.Numberofproductsleft = put.Numberofproducts;
if(put.Numberofproducts >= 2)
put.Morethantwo = true;
else
put.Morethantwo = false;
put.Noticeseen = false;
F.write( (const char *)&put , sizeof(put));
F.close();
}
我已经使用了 reinterpret_cast
尝试从文件中读取数据时出现错误(在我调用 Modify 的 void 函数中),我也尝试过使用常规文本文件,但仍然遇到同样的问题。
Data change;
string answer;
char genrechosen;
int sold;
int continuee;
int continued;
int passedrecords = 0;
vector <int> position;
f1.open(filename, ios::in|ios::out|ios::ate|ios::binary);
int count = 1;
cout<<"What genre is the item you are looking for? "<<endl;
for(int val = 0; val <= logs; val++)
cout<<listofgenres[val]<<endl;
cin >> answer;
//Validates input
if(answer != "4" || answer != "Delete Entry" || answer != "delete entry" || answer != "Delete" || answer != "delete" || answer != "D" || answer != "d" )
answer = validate(answer, 'I'); // Uses I for the char variable because they both use same list, so there is no point in creating new char for it.
//Allows for list of only that genre to be shown
else if(answer == "1" || answer == "Books" || answer == "books" || answer == "Book" || answer == "book" || answer == "B" || answer == "b")
genrechosen = '~';
else if(answer == "2" || answer == "Movies" || answer == "movies" || answer == "Movie" || answer == "movie" || answer == "M" || answer == "m")
genrechosen = '!';
else if(answer == "3" || answer == "Other" || answer == "other" || answer == "O" || answer == "o")
genrechosen = '@';
else
genrechosen = '_';
//Displays List of items in that genre
if(genrechosen == bs)
cout<<"Which book's data will you be modifying? (Type in the number):"<<endl;
if(genrechosen == ms)
cout<<"Which movie's data will you be modifying? (Type in the number):"<<endl;
if(genrechosen == orr)
cout<<"What item's data will you be modifying? (Type in the number):"<<endl;
if(genrechosen == de)
{
deleterec();
return;
}
//Read records until eof
while( f1.read( (char *)&change, sizeof(change)) )
{
if(change.Genre == genrechosen)
{
cout<<count<<") "<<change.Productname<<endl;
count++;
position.push_back(passedrecords);
}
(Personal comment)/* We need to know exactly what record in the file matches that genre, that way when the users chooses a number of the list, we can go and find that exact record. We don't want only 2 records to show up and then conclude the user wants the second record when they actually want the 37th record.*/
passedrecords++;
}
Tl;博士;
问题是当有多个记录时,while 循环只迭代一次。也改变。流派从来没有实际值,因此不会显示任何记录。我无法读取名称或字符数据,只能读取 double /整数。我正在阅读的 C++ 书说对不同的数据类型使用二进制文件,这是错误的吗?谢谢你,抱歉这么久了。顺便说一句,我正在使用代码块编译器。
编辑 1:我一次编写一个结构后遇到此错误:
f1.read( (char *)&change.Genre, sizeof(change.Genre));
uint32_t size = change.Productname.length();
f1.read( (char *)&size, sizeof(size));
f1.read( change.Productname.data() , size); //Problematic Line
f1.read( (const char *)&change.Numberofproducts, sizeof(change.Numberofproducts));
f1.read( ( const char *)&change.Numberofproductsleft, sizeof(change.Numberofproductsleft));
f1.read( ( const char *)&change.Numberofproductssold, sizeof(change.Numberofproductssold));
f1.read( ( const char *)&change.Morethantwo, sizeof(change.Morethantwo));
f1.read( ( const char *)&change.Noticeseen, sizeof(change.Noticeseen));
f1.read( ( const char *)&change.price, sizeof(change.price));
给我错误从 const char 到 char 的无效转换
。
最佳答案
字符串,就像任何可能包含指针的对象一样,不能用 fwrite
写入以供以后安全重构。快速而肮脏的修复(通常不推荐)是替换:
string Productname;
与
char Productname[100];
或者,更好的是,一次写入一个字段。字符串字段可以写成size+characters,像这样:
F.write( (const char *)&put.Genre, sizeof(put.Genre));
uint32_t size = put.Productname.length();
F.write( (const char *)&size, sizeof(size));
F.write(put.Productname.data(), size);
F.write( (const char *)&put.Numberofproducts, sizeof(put.Numberofproducts));
//... and so on
阅读也应如此。
注意:向文件写入和读取对象的过程通常称为序列化和反序列化。例如boost serialization .
注意2:为了文件格式的可移植性,最好写成int32_t
, uint32_t
, int64_t
, ...,而不是普通的 int
或 long
。这是因为 long
(和类似的)在不同的系统上有不同的字节数。
如果您打算使用 PC 以外的任何设备,您还应该注意不同的系统可能有不同的字节顺序(大端或小端)。这种顺序差异使得序列化甚至 uint32_t
都无法跨此类系统移植。为了可移植性,最好将uint32_t
对象按位操作分解成字节,并将这些字节序列化。
对于有符号类型,事情甚至更复杂,因为在某些专用系统上可能的最小 int32_t
值可能不同。幸运的是,这些并不常见。
关于c++ - 尝试将记录中的数据读入程序时难以捉摸的错误(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084414/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!