File Handling and Linked List
File Handling and Linked List
Write a program to scan a text file for unique words and store these words alphabetically in a linked list. You have to take care of all the puncutation marks . For example "my name is Sumit. What is your name? " here we have to scan the file till we find space,a comma,question mark or some other punctuation mark and all the characters before that forms a word . I have written the following code but the problem is that my code also modifies the text file. Please help me to modify my code so that it is used to scan the text file and store the unique words in a linked list in sorted order without modifying the text file....... Please help........
Expand|Select|Wrap|Line Numbers
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
#include<stdio.h> #include<conio.h> #include<alloc.h> #include<process.h> #include<dos.h> struct node { char value[15]; struct node * next; }; typedef struct node * nodeptr; void addnode(nodeptr *,char []); void myinfo(); void main() { nodeptr front=NULL,temp,p,q; FILE *outfile; int c,count=1; char ch; char *filename; char *type; char str[15],tmp[15]; filename=(char *)malloc(sizeof(char)*30); type=(char *)malloc(sizeof(char)*10); myinfo(); clrscr(); puts("ENTER FILENAME "); puts("--------------"); gets(filename); puts("\nENTER MODE OF WRITING ");
33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.
puts("---------------------"); gets(type); if((outfile=fopen(filename,type))==NULL) { puts("ERROR"); exit(1); } puts("\nENTER TEXT TO THE FILE: USE ^Z TO END"); puts("-------------------------------------"); do { c=fgetc(stdin); if(c=='.'||c==','||c=='?'||c==';'||c=='"') { c=' '; fputc(c,outfile); } else fputc(c,outfile); }while(c!=EOF); rewind(outfile); outfile=fopen(filename,"r"); while(!feof(outfile)) { fscanf(outfile,"%s",str);
81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. void addnode(nodeptr *q,char val[]) fclose(outfile); getch(); } if(count==1) { addnode(&front,str); } else count=1; } } /* SORTING PART */ for(p=front;p->next!=NULL;p=p->next) { for(q=p->next;q!=NULL;q=q->next) { if(strcmp(p->value,q->value)>0) { strcpy(tmp,q->value); strcpy(q->value,p->value); strcpy(p->value,tmp); } } }
/* DISPLAYING SORTED LIST */ puts("\nUNIQUE ELEMENTS IN ALPHABETICAL/ASCENDING ORDER"); puts("-----------------------------------------------"); p=front; while(p!=NULL) { printf("%s\t",p->value); p=p->next; }
129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176.
{ nodeptr p=NULL,r; p=(nodeptr)malloc(sizeof(struct node)); strcpy(p->value,val); if(*q==NULL) { p->next=NULL; *q=p; } else { r=*q; while(r->next!=NULL) r=r->next; p->next=NULL; r->next=p; } } void myinfo() { int i; char info1[55]="A PROGRAM TO READ A TEXT FILE AND TO STORE UNIQUE WORDS"; char info2[48]="IN A LINKED LIST IN ALPHABETICAL/ASCENDING ORDER"; char info3[42]="DESIGNED BY SUMIT GAUR. MCA-I ROLL NO 4019"; clrscr();gotoxy(12,10); for(i=0;i<55;i++) { printf("%c",info1[i]); delay(100); } gotoxy(15,11); for(i=0;i<48;i++) { printf("%c",info2[i]); delay(100); } gotoxy(17,13); for(i=0;i<42;i++) { printf("%c",info3[i]); delay(100); } delay(5000);
177. 178. }
179. Hi, everyone. I am having a trouble with this program. It must read data from a file and store it in linked list. Then I want to write it back to the file. I wrote a program but it doesn't work. Can anyone help me to understand where I am wrong. Thanks in advance for your help.
01 #include <stdio.h> 02 #include<stdlib.h> 03 #define CHARS 30 04 #define NAMES 20 05 06 07 int main(void) 08 { 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /* open the file and load the strings into 2 arrays 25 26 27 28 29 30 31 32 while (!feof(fp)) { count++; fscanf(fp,"%s %s ",list1[count],list2[count]); } if((fp=fopen("merge.dat","r"))==NULL) printf("Cannot open file fot reading"); */ }; typedef struct NODE Node; FILE *fp, *out; Node* head; Node* curr; head=(Node*)malloc(sizeof(Node)); curr=head; struct NODE { char name[CHARS]; struct NODE *next; int count=-1; int index1=0,index2=0, i=0; char list1[NAMES][CHARS],list2[NAMES][CHARS];
33 34
fclose(fp);
35 /*copys names from both lists until one of the lists is finished*/ 36 while(index1<=count&&index2<=count) 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /*finish off the list that isn't finished*/ 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 } for(i=index2; i<=count; ++index2) { curr->next=(Node*)malloc(sizeof(Node)); curr=curr->next; strcpy(curr->name, list1[index2]); ++index2; } for(i=index1; i<=count; ++index1) { curr->next=(Node*)malloc(sizeof(Node)); curr=curr->next; strcpy(curr->name, list1[index1]); ++index1; } } else { strcpy(curr->name, list2[index2]); ++index2; } if(strcmp(list1[index1], list2[index2])>0) /*compare list1 and list2*/ { strcpy(curr->name, list1[index1]); ++index1; { curr->next=(Node*)malloc(sizeof(Node)); node*/ curr=curr->next; allocated space*/ /* point curr to new /*allocate space for next
72 73 74
curr->next=NULL; curr=head;
75 /*writing list back to the file*/ 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 } free(&curr); return 0; while(curr!=NULL) { fprintf(out, "%s\n", curr->name); curr=curr->next; } fclose(out); if((out=fopen("merge.dat","w"))==NULL) printf("Cannot open file for writing\n");
#include<stdio.h> struct record { char letter; int empNum; char lastName[20]; char firstName[12]; double hourRate; }; int main(void) { static const char filename[] = "file.txt"; FILE *file = fopen(filename, "r"); if ( file != NULL ) { char line[BUFSIZ]; struct record record; while ( fgets(line, sizeof line, file) != NULL && sscanf(line, "%d %11s %19s %lf", &record.empNum, record.firstName, record.lastName, &record.hourRate) == 4 ) { #ifndef NDEBUG /* while debugging */ printf("%10d %-20s %-12s %g\n", record.empNum, record.lastName, record.firstName, record.hourRate);
#else /* real code */ /* add 'record' to linked list */ #endif } fclose(file); } else { perror(filename); } return 0; } /* my output 12452 Smith 891756 Bloe 268174 Smith 718756 Totts 261786 Packer */ John Joe Sample Terry James 23.56 24.94 18.56 27.86 25.98
> program that reads 3 list of numbers, > which are stored in three seperate files, > and creates one sorted list. > Each file should contain not more than 15 numbers. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #define #define #define #define #define NFILES 3 MAX_LINES_PER_FILE 15 LU_RAND_SEED 0LU LU_RAND(S) ((S) * 69069 + 362437 & 0XFFFFFFFFLU) NMEMB(A) (sizeof (A) / sizeof *(A))
struct list_node { struct list_node *next; void *data; }; typedef struct list_node list_type; int numcomp(const list_type *a, const list_type *b); int get_line(char **lineptr, size_t *n, FILE *stream); list_type *list_append (list_type **head, list_type *tail, void *data, size_t size); void list_free(list_type *node, void (*free_data)(void *)); list_type *list_sort(list_type *head, int (*compar)(const list_type *, const list_type *)); int list_fputs(const list_type *node, FILE *stream); static list_type *sort_node (list_type *head, int (*compar)(const list_type *, const list_type *)); static list_type *merge_lists(list_type *head, list_type *tail, int (*compar)(const list_type *, const list_type *));
static list_type *split_list(list_type *head); int main(void) { long unsigned index, lu_seed, line; int rc; char *buff; size_t size; list_type *tail, *head; char fn[L_tmpnam]; FILE *fp; puts("/* BEGIN file_sort_2.c output */"); /* ** Open temporary input text files for writing. ** Write long unsigned values to standard output ** as well as to temporary input text files. ** Close each file after filling with long unsigned values. ** Open input text files for reading. ** Represent each line of each input text file ** as a string in a node of a linked list. ** Close each temp input file after reading. */ size = 0; buff = NULL; head = tail = NULL; lu_seed = LU_RAND_SEED; tmpnam(fn); for (index = 0; index != NFILES; ++index) { fp = fopen(fn, "w"); if (fp == NULL) { fputs("fopen(fn, \"w\") == NULL\n", stderr); break; } printf("\nInput file #%lu\n", index + 1); line = lu_seed % MAX_LINES_PER_FILE + 1; while (line-- != 0) { lu_seed = LU_RAND(lu_seed); fprintf( fp, "%lu\n", lu_seed); fprintf(stdout, "%lu\n", lu_seed); } fclose(fp); fp = fopen(fn, "r"); if (fp == NULL) { fputs("fopen(fn, \"r\") == NULL\n", stderr); break; } while ((rc = get_line(&buff, &size, fp)) > 0) { tail = list_append(&head, tail, buff, rc); if (tail == NULL) { fputs("tail == NULL\n", stderr); break; } } fclose(fp); if (rc != EOF) {
fprintf(stderr, "rc == %d\n", rc); break; } } /* ** Free allocated buffer used by get_line function. ** Remove temp input file. */ free(buff); remove(fn); /* ** Sort list. ** Display list. ** Free list. */ head = list_sort(head, numcomp); puts("\nSorted Output List"); list_fputs(head, stdout); list_free(head, free); puts("\n/* END file_sort_2.c output */"); return 0; } int numcomp(const list_type *a, const list_type *b) { const long unsigned a_num = strtoul(a -> data, NULL, 10); const long unsigned b_num = strtoul(b -> data, NULL, 10); return b_num > a_num ? -1 : b_num != a_num; } int get_line(char **lineptr, size_t *n, FILE *stream) { int rc; void *p; size_t count; count = 0; while ((rc = getc(stream)) != EOF || !feof(stream) && !ferror(stream)) { ++count; if (count == (size_t)-2) { if (rc != '\n') { (*lineptr)[count] = '\0'; (*lineptr)[count - 1] = (char)rc; } else { (*lineptr)[count - 1] = '\0'; } break; } if (count + 2 > *n) { p = realloc(*lineptr, count + 2); if (p == NULL) { if (*n > count) { if (rc != '\n') {
(*lineptr)[count] = '\0'; (*lineptr)[count - 1] = (char)rc; } else { (*lineptr)[count - 1] = '\0'; } } else { if (*n != 0) { **lineptr = '\0'; } ungetc(rc, stream); } count = 0; break; } *lineptr = p; *n = count + 2; } if (rc != '\n') { (*lineptr)[count - 1] = (char)rc; } else { (*lineptr)[count - 1] = '\0'; break; } } if (rc != EOF || !feof(stream) && !ferror(stream)) { rc = INT_MAX > count ? count : INT_MAX; } else { if (*n > count) { (*lineptr)[count] = '\0'; } } return rc; } list_type *list_append (list_type **head, list_type *tail, void *data, size_t size) { list_type *node; node = malloc(sizeof *node); if (node != NULL) { node -> next = NULL; node -> data = malloc(size); if (node -> data != NULL) { memcpy(node -> data, data, size); if (*head != NULL) { tail -> next = node; } else { *head = node; } } else { free(node); node = NULL; } } return node;
} void list_free(list_type *node, void (*free_data)(void *)) { list_type *next_node; while (node != NULL) { next_node = node -> next; free_data(node -> data); free(node); node = next_node; } } list_type *list_sort(list_type *head, int (*compar)(const list_type *, const list_type *)) { return head != NULL ? sort_node(head, compar) : head; } int list_fputs(const list_type *node, FILE *stream) { int rc = 0; while (node != NULL && (rc = fputs(node -> data, stream)) != EOF && (rc = putc('\n', stream)) != EOF) { node = node -> next; } return rc; } static list_type *sort_node(list_type *head, int (*compar)(const list_type *, const list_type *)) { list_type *tail; if (head -> next != NULL) { tail = split_list(head); tail = sort_node(tail, compar); head = sort_node(head, compar); head = merge_lists(head, tail, compar); } return head; } static list_type *split_list(list_type *head) { list_type *tail; tail = head -> next; while ((tail = tail -> next) != NULL && (tail = tail -> next) != NULL) { head = head -> next;
} tail = head -> next; head -> next = NULL; return tail; } static list_type *merge_lists(list_type *head, list_type *tail, int (*compar)(const list_type *, const list_type *)) { list_type *list, *sorted, **node; node = compar(head, tail) > 0 ? &tail : &head; list = sorted = *node; *node = sorted -> next; while (*node != NULL) { node = compar(head, tail) > 0 ? &tail : &head; sorted -> next = *node; sorted = *node; *node = sorted -> next; } sorted -> next = tail != NULL ? tail : head; return list; } /* END file_sort_2.c */
-pete
}word_list; list *list_add(list ** head, char ch) { list *newNode = malloc(sizeof(list)); newNode->data = ch; newNode->next = *head; //printf("%p\n", newNode->next); *head = newNode; return *head; }
word_list *word_add(word_list ** words, char* word[]) { word_list *newNode = malloc(sizeof(word_list)); newNode->word = word; newNode->next = *words; *words = newNode->next; return *words; } FILE *file; int i,count; char *ptr1; list *head = NULL; //linked list to store each character from file word_list *words =NULL; //linked list to store each word created taken from list above char word[30]; int main(int argc, char *argv[]) { i = 0; count = 0; int length; //print the name of the file inputted printf("%s\n", argv[1]); //open the file with the read only format file = fopen(argv[1], "r"); //goes to the end of the file fseek(file, 0, SEEK_END); //sets the character length length = ftell(file); //sets the file back to the start rewind(file); //inputs one character at a time from file to list while (count <= length) { //inputs pointer to head, an uppercase of one character list_add(&head, toupper(fgetc(file))); count++; }
if(file == NULL)//checks to see if the file opened { printf("Error:Could not open file"); return 0; } else { printf("File opened ok\n"); fclose(file);//close the file findwords(head);//call function findwords } return 0; } //this function goes through the linked list of characters to create a list of words int findwords(struct node *head) { //create temp linked list list *ptrTmp = head; i = 0; int j; while(ptrTmp != NULL) { if(ptrTmp->data) { if(((ptrTmp->data >= 65) && (ptrTmp->data <= 90)) || (ptrTmp->data == '-') || (ptrTmp->data == '\'')) { word[i] = ptrTmp->data; i++; } else { i = 0; printf("%s\n", word); //pass the words linked list and the new word into word_add function word_add(&words, &word); //sets word to NULL for(j = 0;j <= (strlen(word) - 1); j++) { word[j] = 0; } } } ptrTmp = ptrTmp->next; } /* list *ptrTmp2 = words; while(ptrTmp2 != NULL)
Farewell