- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个项目,该项目使用二叉搜索树和文件输入/输出。二叉搜索树似乎运行正常,但是要求之一是能够通过文件的输入将数据添加到二叉树(然后输出所有二叉树数据)。我使用 fgets+sscanf 方法查看文件,看起来它正确地获取了所有项目,但字符串发生了很大的改变。我怀疑这是一个空终止符问题,但无法确定我可以在哪里修复它。当我手动将节点添加到二叉树(而不是从文件中)时,它们会毫无问题地添加,并毫无问题地写入新的文本文件。唯一的问题来自于从文件中读取数据,这会引发一些奇怪的错误,从而修改我的数据(例如,字符串以奇怪的格式出现,如 é@—Ç,而不是 FirstName1 LastName1 的预期输出)。
还要道歉,我对 C 还很陌生。所以它可能看起来有点困惑。
<小时/>如下面的代码所示,我尝试手动向字符串添加空终止符,因为我认为这是问题所在。我尝试更改文件内容并在其中添加空终止符,并且我也尝试使用 fscanf 方法来读取文件。我研究了其他 stackoverflow 页面,寻找我可能丢失的东西,但我没有找到任何东西。我确信这是我忽略的一些愚蠢的事情。
<小时/>同样,下面的这些文本文件内容仅与从文件中添加的内容有关。我通过使用字符串文字调用 addNode 函数手动添加的任何内容都可以正常工作
我尝试从中添加学生的“输入”文本文件(又名 addFile 在我的测试中使用):
400085 FirstName1 LastName1 3.88 CompSci
400076 FirstName2 LastName2 2.77 LibertyArts
writeFile 使用的我的“输出”文本文件:
400085 é@—Ç 3.880000 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
400076 é@—Ç 2.770000 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
<小时/>
添加文件获取字符串名称,查找文件并打开其内容
void addFile(char* name) {
FILE* myFile = fopen(name, "r");
if (myFile == NULL) {
perror(name);
return;
}
int tempId = 0;
char firstName[100];
char lastName[100];
double GPA = 0.0;
char major[100];
int res = 0;
char line[10000];
while (fgets(line, 1000, myFile) != NULL) {
res = sscanf(line, "%d %s %s %lf %s", &tempId, firstName, lastName, &GPA, major);
firstName[99] = '\0';
lastName[99] = '\0';
major[99] = '\0';
addNode(tempId, firstName, lastName, GPA, major);
}
fclose(myFile);
}
写入文件将二叉搜索树的内容写入文本文件 testFile.txt
void preorder(struct Node* nodeAt) {
char buffer[10000];
snprintf(buffer, sizeof(buffer), "%d %s %s %lf %s \n", nodeAt->id, nodeAt->firstName, nodeAt->lastName, nodeAt->GPA, nodeAt->major);
strcat(tempString, buffer);
if (nodeAt->leftChild != NULL)
preorder(nodeAt->leftChild);
if (nodeAt->rightChild != NULL)
preorder(nodeAt->rightChild);
}
void writeFile() {
FILE* fp = fopen("testFile.txt", "w");
tempString = (char*) malloc(sizeof(char*) * 10000);
preorder(root);
fprintf(fp, "%s", tempString);
free(tempString);
tempString = "";
}
addFile调用的其他相关函数
/*
createNode() method
"safe" way of creating the node. Also cleans up the code.
*/
struct Node* createNode(int id, char* firstName, char* lastName, double GPA, char* major) {
struct Node* myNode = (struct Node*) malloc(sizeof(struct Node));
if (myNode != NULL) {
myNode->id = id;
myNode->firstName = firstName;
myNode->lastName = lastName;
myNode->GPA = GPA;
myNode->major = major;
myNode->rightChild = NULL;
myNode->leftChild = NULL;
myNode->parent = NULL;
return myNode;
}
else
return NULL;
}
/*
addNode() + addNodeHelper() methods
Adds a node to the binary tree. The helper method is just recursive to make searching easier
*/
struct Node* addNodeHelper(struct Node* nodeAt, int id, struct Node* nodeToAdd) {
struct Node* temp = nodeAt;
if (temp->leftChild == NULL && id < temp->id) {
nodeAt->leftChild = nodeToAdd;
nodeAt->leftChild->parent = nodeAt;
}
else if (temp->rightChild == NULL && id > temp->id) {
nodeAt->rightChild = nodeToAdd;
nodeAt->rightChild->parent = nodeAt;
}
if (id < temp->id)
addNodeHelper(temp->leftChild, id, nodeToAdd);
else if (id > temp->id)
addNodeHelper(temp->rightChild, id, nodeToAdd);
}
void addNode(int id, char* firstName, char* lastName, double GPA, char* major) {
struct Node* myNode = createNode(id, firstName, lastName, GPA, major);
if (myNode != NULL) {
struct Node* findTheNode = findNode(root, myNode->id);
if (root == NULL) {
root = myNode;
return;
}
if (findTheNode != NULL) {
printf("ERROR: Student ID must be unique!\n");
return;
} else
addNodeHelper(root, myNode->id, myNode);
}
}
非常感谢任何提示/建议:)
最佳答案
createNode
只是保存指向它所给定字符串的指针。 addFile
每次循环都会覆盖相同的字符串,因此每个节点都有相同的指针。此外,这些是局部变量,因此在 addFile
返回后指针将变得无效。
您需要复制字符串。
addNode(tempId, strdup(firstName), strdup(lastName), GPA, strdup(major));
关于C 从一个文件读取数据并将其写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59278444/
#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
我是一名优秀的程序员,十分优秀!