程序不会从第一行文本文件中读取某些字符

时间:2018-04-13 18:47:35

标签: c file data-structures

所以我的程序在点击" 1"之后基本上要求分配名称/学生姓名。从学生菜单中提交作业。该函数从我在调试文件夹中的文本文件中读取任意分配,名为" myassignment.txt"。然后它创建一个名为" submission.txt"的新文件。带有作业名称,学生姓名和作业 当我点击" 2"从学生菜单中查看提交的作业,它会打印作业名称和学生名称,但跳过实际作业第一行的前几个字符。
它会根据作业名称和学生姓名的长度跳过更多或更少的字符 我无法弄清楚它为什么要这样做 这是我在菜单的前两个选项中使用的数据结构,菜单和函数的代码:

#include "assignmentgrading3.h"

#define MAX_STUDENT_NAME_SIZE 50
#define MAX_ASSIGNMENT_NAME_SIZE 50
#define MAX_ASSIGNMENT_SIZE 1000

typedef struct{
    char assignmentName[MAX_ASSIGNMENT_NAME_SIZE];
    char studentName[MAX_STUDENT_NAME_SIZE];
    char assignment[MAX_ASSIGNMENT_SIZE];
    double score;
} Assignment;

    void studentMenu(Assignment* assignmentStruct) {
        int choice;
        do {
            printf("\nStudent Menu:\n");
            printf("1. Submit an assignment\n");
            printf("2. See the submitted assignment\n");
            printf("3. See the graded assignment\n");
            printf("4. Exit\n");
            printf("Please enter a number from 1 - 4: ");
            scanf("%d", &choice);

            switch (choice) {
                case 1:
                    submitAssignment(assignmentStruct, "myassignment.txt");
                    break;
                case 2:
                    getAssignment(assignmentStruct);
                    displayAssignment(assignmentStruct);
                    break;
                case 3:
                    getGradedAssignment(assignmentStruct);
                    displayGradedAssignment(assignmentStruct);
                    break;
                case 4:
                    exit(0);
                    break;
            }
        } while (choice != 5);
    }

void readRemainingLines(FILE* pFile, char* assignment){
    long charsRead = 0;
    while(fgets(assignment + charsRead, MAX_ASSIGNMENT_SIZE - charsRead, pFile)!= NULL)
    {
        charsRead = strlen(assignment);
        if(charsRead >= MAX_ASSIGNMENT_SIZE - 1)  //Credits: Carl Gelfand
        break;
    }
    assignment[MAX_ASSIGNMENT_SIZE-1] = 0;  //Just to make sure.
}

//Reads the file whose name is provided as string “fileName”, 
//and creates a file named  “submission.txt” as specified in the functional specification. 
//It returns a 1 when it is successful, otherwise it returns a 0. 
int submitAssignment(Assignment* assignmentStruct, char* fileName) {
    FILE* pFile =0;
    //char assignment[MAX_ASSIGNMENT_SIZE];
    char* submissionFileName="submission.txt";

    //Reading information from a user provided file : fileName
    pFile = fopen(fileName,"r");
    if(pFile==NULL){
        printf("%s file did not open\n,",fileName);
        exit(0);
    }//EO if(pFile==NULL)
    printf("Please enter the name of the assignment: ");
    scanf(" %s", assignmentStruct->assignmentName);

    printf("Please enter  your (student) name: ");
    scanf(" %s", assignmentStruct->studentName);
    readRemainingLines(pFile,  assignmentStruct->assignment);
    fclose(pFile);

    // Writing Information to "submission.txt"
    pFile = fopen(submissionFileName, "w");
    if(pFile == NULL) {
        printf("%s file did not open\n,", submissionFileName);
        exit(0);
    } //EO if(pFile==NULL)

    fprintf(pFile, "%s\n", assignmentStruct->assignmentName);
    fprintf(pFile, "%s\n", assignmentStruct->studentName);
    fprintf(pFile, "%s\n", assignmentStruct->assignment);
    fclose(pFile); 
    return 1;
}


int getAssignment(Assignment* assignmentStruct) {
    FILE* pFile = 0;
    pFile = fopen("submission.txt","r");
    if(pFile==NULL){
        printf("file did not open\n,");
        exit(0);
    }
    fscanf(pFile, "%[^\n]", assignmentStruct->assignmentName);
    fscanf(pFile, "%[^\n]", assignmentStruct->studentName);
    readRemainingLines(pFile, assignmentStruct->assignment);
    return 1;
}

void displayAssignment(Assignment* assignmentStruct) {
    char* middleOfAssignment = &(assignmentStruct->assignment[strlen(assignmentStruct->assignmentName) + strlen(assignmentStruct->studentName) + 2]);
    print(assignmentStruct->assignmentName, assignmentStruct->studentName);
    printf("%s \n", middleOfAssignment);
    //printf("%s \n", assignment);
}

void print(char* assignmentName, char* studentName) {
    printf("Assignment Name: %s \nStudent: %s\n", assignmentName, studentName);
}

1 个答案:

答案 0 :(得分:1)

displayAssignment在分配middleOfAssignment时会跳过作业的前几个字符。它正在跳过第一个strlen(assignmentStruct->assignmentName) + strlen(assignmentStruct->studentName) + 2字符。

它应该只打印assignmentStruct->assignment,不需要middleOfAssignment。该代码的唯一原因是,如果assignment在开头包含作业名称和学生姓名的副本,但它不会。

void displayAssignment(Assignment* assignmentStruct) {
    print(assignmentStruct->assignmentName, assignmentStruct->studentName);
    printf("%s \n", assignmentStruct->assignment);
}