我正在编写一个程序,按字母顺序对文件中的行进行排序。
我想通过添加排序到动态分配的单向列表来做到这一点。
为了测试我创建了一个程序,它从fgets
到char bufor[]
读取文件中的行,然后我想将它添加到单向列表的开头,但是当我想检查{ {1}},然后我收到了错误消息。问题在哪里?
以下代码: 我做了结构
*head!=NULL
主要是:
typedef struct LISTA lista;
struct LISTA
{ char*line;
lista* next;};
void check(int argc,char * argv[]) {
if (argc < 2)
{
fprintf (stderr, "Uzycie: %s nazwa_pliku\n", argv[0]);
exit (-1);
} }
FILE* otworz_plikR(char* namef) // Otwieranie pliku w Trybie READ
{
FILE* fp;
fp = fopen(namef, "r");
if (fp == NULL) {
fprintf(stderr, "Cannot open source file!\n");
exit(1);
}
else printf("Source file opened!\n");
return fp;
}
lista* stworz_liste(char* namef)
{
lista **head=NULL;
char bufor[100];
char *line;
lista *tmp;
*head=NULL;
size_t* len = 0;
FILE* fp=otworz_plikR(namef);
while(fgets(bufor,&len,fp)!=NULL)
{
line = (char*)malloc(sizeof(char)* (strlen(&bufor) + 1));
strcpy(line, bufor);
printf("%s",line);
tmp = (lista*)malloc(sizeof(lista));
tmp->next=NULL;
tmp->line=line;
if (*head != NULL) tmp->next = *head;
*head = tmp;
}
fclose(fp);
free (bufor);
free (len);
fclose(fp);
}
感谢您的帮助。 argv [3] = output.txt argv [5] = input.txt。 也许你有其他问题要解决这个问题?
答案 0 :(得分:1)
我简化了列表构建器功能,但添加了更多错误检查。该方法是创建每个新节点,将其链接到现有列表,并使其成为列表的新头。最后它返回列表指针。
lista *stworz_liste(char *namef)
{
lista *head = NULL; // single indirection
char bufor[100];
lista *tmp;
FILE* fp=otworz_plikR(namef);
while(fgets(bufor, sizeof(bufor), fp) != NULL) // replaced len
{
bufor [ strcspn(bufor, "\r\n") ] = 0; // remove trailing newline
tmp = malloc(sizeof(lista)); // memory for list item
if (tmp == NULL)
exit(1); // error
tmp->line = malloc(strlen(bufor) + 1); // simplify, remove &
if (tmp->line == NULL)
exit(1); // error
strcpy(tmp->line, bufor);
printf("%s\n",tmp->line);
tmp->next = head; // link to current list
head = tmp; // new head of list
}
fclose(fp);
//free (bufor); // can't free this
//fclose(fp); // close once only
return head; // return head of list
}