gpt4 book ai didi

c - 写入多个文件会出现段错误,单个文件不会

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:07 26 4
gpt4 key购买 nike

我写了一个函数来将链表数据写入一个文件,当我在一个文件中写入 main()WriteData() 时,它就可以工作了正好。但是当我在另一个文件中编写 WriteData() 并使用头文件将其包含在 main 文件中时,它会给我段错误。这是我的代码

abcd.h:

#ifndef _ABCD_H_
#define _ABCD_H_
struct node{
char word[50];
char sort[50];
struct node *next;
}
void WriteData(struct node *head);
void read_data(struct node **head, FILE *fp);
#endif

ma​​in.c:

#include"abcd.h"
int main(int argc, char *argv[]) //file is given as command line argument
{
FILE *fp = fopen(argv[1], "r");
struct node *head = NULL;
read_data(&head, fp); //loads the contents of the file to the list
WriteData(head);
}

writeData.c:

#include"abcd.h"
void WriteData(struct node *head)
{
FILE *fp = fopen("dictionary.txt", "w");
if(fp == NULL){
printf("Error opening file..\n");
return;
}
while(head != NULL){
fprintf(fp, "\n%s:", head->word);
fprintf(fp, "%s", head->sort);
head = head->next;
}
fclose(fp);
printf("Data saved successfully..\n");
}

readData.c:

#include "abcd.h"
void read_data(struct node **head, FILE *fp)
{
if(fp == NULL){
printf("Error opening file..\n");
return;
}
struct node temp;
temp.next = NULL;
struct node *hp, *curr;
hp = *head;
while(!feof(fp)){
fscanf(fp, " %[^:]", temp.word);
fseek(fp, 1, SEEK_CUR);
fscanf(fp, " %[^\n]", temp.sort);
struct node *temp2 = (struct node*)malloc(sizeof(struct node));
if(temp2 == NULL){
printf("Couldn't make new node by malloc:");
return;
}
*temp2 = temp;
if(hp == NULL){
curr = hp = temp2;
}
else
curr = curr->next = temp2;
}
fclose(fp);
*head = hp;
printf("Data loaded successfully..\n");
}

错误:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a5cc80 in _IO_vfprintf_internal (s=0x604830,
format=<optimized out>, ap=ap@entry=0x7fffffffd928) at vfprintf.c:1632
1632 vfprintf.c: No such file or directory.

最佳答案

我修正了您代码中的一些拼写错误,这是我的版本:

ma​​in.c

#include "hd.h"

int main(int argc, char *argv[]) //file is given as command line argument
{
FILE *fp = fopen(argv[1], "r");
struct node *head = NULL;

//read_data(&head, fp); //loads the contents of the file to the list
WriteData(head);
}

高清.h

#ifndef _hd_h_
#define _hd_h_
struct node{
char word[50];
char sort[50];
struct node *next;
};

#include <stdio.h>
extern void WriteData(struct node *head);

#endif

写.c

#include "hd.h" 

void WriteData(struct node *head)
{
FILE *fp = fopen("dictionary.txt", "w");
if(fp == NULL){
printf("Error opening file..\n");
return;
}
while(head != NULL){
fprintf(fp, "\n%s:", head->word);
fprintf(fp, "%s", head->sort);
head = head->next;
}
fclose(fp);
printf("Data saved successfully..\n");
}

使用 GCC 编译:

gcc -Wall main.c write.c -o prog

你应该考虑我们必须编译两个.c文件,并将它们链接在一起以 main 的名称制作可执行目标代码(二进制文件)。

然后我们可以在类 Unix 机器中调用加载程序来加载和执行程序 main,在终端中键入此命令,然后按 Enter 键。

运行

./main

[编辑 - ToDo]

感谢Basile Starynkevitch对于宝贵的评论,并在我的帖子中指出一些错误。

  1. 单独的编译和链接过程。
  2. 使用 make 文件使它们自动化。
  3. 一些额外的改进、解释、文档。
  4. 使用不同的链接器程序。
  5. 对代码进行一些改进。

关于c - 写入多个文件会出现段错误,单个文件不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44529961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com