У меня есть одна c программа, которая создает двоичное дерево и записывает в файл, используя системный вызов open и write. В другой программе c я пытаюсь открыть файл и прочитать все содержимое. Однако, когда я пытаюсь это сделать, он читает только первую строку файла.
Я изолировал проблему, чтобы что-то пошло не так при записи в файл.
Когда я запускаю первую программу, файл успешно создается, но когда я пытаюсь открыть его в vscode, он говорит, что файл не может быть открыт из-за того, что он кодируется неузнаваемым способом. Однако, когда я использую общий "cat file.txt", он выводит ожидаемое содержимое на консоль. Причина, по которой я думаю, что ошибка заключается в функции записи в файл, заключается в том, что если я вручную создаю файл и ctrl c и ctrl p выводим в него «cat file.txt» и пытаемся прочитать этот файл, все работает. Поэтому я предполагаю, что проблема заключается в том, как я пишу в файл.
КАК ДЕРЕВО ПРОЧИТАЕТ В ФАЙЛ: При записи двоичного дерева в файл. Сначала я создаю и открываю файл для записи. Затем я передаю файловый дескриптор функции, которая рекурсивно обходит дерево, находит все узлы и записывает их в файл. Затем закрывает дескриптор файла.
******** Вот код для записи дерева в файл *******
void constructFile(int fd, MinHeapNode *root, int encoding[], int top)
{
int num_written = 0;
char tab = '\t';
char nl = '\n';
if (root->right)
{
encoding[top] = 1;
constructFile(fd, root->right, encoding, top + 1);
}
if (root->left)
{
encoding[top] = 0;
constructFile(fd, root->left, encoding, top + 1);
}
//if leaf is reached then print out the data and freq
if (isLeaf(root)) {
int i;
for (i = 0; i < top; ++i){
//printf("%d", encoding[i]);
int code = encoding[i];
char c = code + '0';
num_written = write(fd, &c, sizeof(c));
if(num_written == -1){
printf("Unable to write file\n");
exit(1);
}
}
num_written = write(fd, &tab, sizeof(tab));
if(num_written == -1){
printf("Unable to write file\n");
exit(1);
}
//printf(" %s", root->data);
num_written = write(fd, root->data, sizeof(root->data));
if(num_written == -1){
printf("Unable to write file\n");
exit(1);
}
//printf("\n");
num_written = write(fd, &nl, sizeof(nl));
if(num_written == -1){
printf("Unable to write file\n");
exit(1);
}
}
}
int main(){
int fd = open("codebook", O_WRONLY, 0600);
if(fd == -1){
printf("file error");
exit(1);
}
//call constructFile;
close(fd);
return 0;
}
Я могу рассчитывать только на системные вызовы для открытия читать и писать, так что не пишите: (
Я пытался это исправить, но, похоже, не могу этого сделать. Я довольно новичок в C и был бы очень признателен всем, кто имеет представление об этом.
Спасибо!