从包含列表的文本文件中读取

时间:2015-09-18 16:42:15

标签: c

该计划的目的是阅读一个文本文件,其中包含55位作者和书籍标题的列表。列表的格式是(作者姓名,书签)。我可以使用malloc,strlen,strtok和strcopy。到目前为止,我得到了程序来读出作者的名字,但我仍然坚持如何让程序阅读书籍的标题。我如何让程序从文本文件中读取书籍的标题?我知道这段代码中有错误,所以请善待。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void loadBookName(char* filename, char* authorName[55], char* bookName[55]);

int main(int argc, char* argv[])
{
  //Create two arrays each with length 55
  char* authorName[55];
  char* bookName[55];

  //Ask the user for the name of the file
  char fileName[30];
  //Insert your code here
  printf("Please enter the name of the file\n");
  scanf("%s", fileName);

  //Call the method loadBookName
  loadBookName(fileName, authorName, bookName);

return 0;

//Print the two arrays to test if the two arrays were correctly loaded with the data
int i = 0;
printf("%-30s%-40s\n", "Author", "Book");
for (i = 0; i < 55; i++) {
    printf("%-30s%-40s\n", authorName[i], bookName[i]);
}

}

   /*
  loadBookName method
  This method is responsible for:
   1. Take a file containing a book name and the author name as input
   2. Open the file       
   3. Read the information in the file and store it in two arrays: authorName, bookName
   4. Return the two arrays to the main method.
   */
  void loadBookName(char* filename, char* authorName[55], char* bookName[55])
  {
   int i;
   char string_array[80];
   const char comma[2] = ",";
   //Open the file
   FILE *fp;
   fp = fopen(filename, "r");
   if (fp == NULL)
   {
       printf("Failed to open file\n");
       exit(1);
   }

   for (i=0; i<55; i++)
      {
       fgets(string_array, 80, fp);
       authorName[i] = strtok(string_array, comma);
       printf("%s\n", *authorName);
      }





      //Close the file
      fclose(fp);
      }

当我在终端中运行程序时,它要求我输入文件名(books.txt)。然后,当我输入文件名时,程序会打印出55位作者的列表。

2 个答案:

答案 0 :(得分:0)

使用strlcpy分隔字符串的简单方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int 
main(void )
{
    size_t i = 1;
    char *authorName, *bookName;
    const char *a_line_in_a_file  = 
         "Lewis Carroll,The Hunting of the Snark";
    const char *title = a_line_in_a_file;
    while ( *title != ','){
        title++;
        i++;}
    authorName = malloc(i);
    bookName = malloc(strlen(title));
    title++;
#if __BSD_VISIBLE
    strlcpy(bookName, title, strlen(title) + 1);
    strlcpy(authorName, a_line_in_a_file, i);
#else
    snprintf(bookName, strlen(title) + 1, "%s", title);
    snprintf(authorName, i, "%s", a_line_in_a_file);
#endif 
    printf("%-30s%-40s\n", authorName, bookName);
   free(authorName);
   free(bookName);
   return 0;
}

答案 1 :(得分:0)

我面前没有编译器,如果有任何编译错误,请原谅。但我认为您可以在现有代码中尝试以下内容:

<强>更新:

评论后,我更新了一行。这是编译和工作。

假设:用户需要处理错误处理,例如文件不存在,文件无法打开,缓冲区溢出等。

    char *token;

    for (i=0; i<55; i++)
    {
        //fgets(string_array, 80, fp);
        //This will take care in case if lines are less than 55
        if(!fgets(string_array, 80, fp))
            break;


        //Get the author
        token = strtokstring_array, comma);
        authorName[i] = token;  // or use string copy functions

        //Get book name
        while( token != NULL ) 
        {
            printf( " %s\n", token );    //this shall print author name
            token = strtok(NULL, comma);
            bookName[i] = token;
            printf( " %s\n", token );    //this shall print book name

            //EDIT: This is additional line after suggestions
            token = strtok(NULL, comma);
        }
    }