программа создает файл, но не пишет в него - PullRequest
0 голосов
/ 25 апреля 2018

Я очень новичок в C, но я пытаюсь учиться. Я пытаюсь прямо сейчас сделать программу для чтения из файла CSV и взять из него только целые числа и записать их в отдельный файл .txt. Я не понимаю, почему он создаст файл, но почему он ничего не записывает в него. Вот код в методах «getTokensFromLineforOutput» и «writeOutput» я пытаюсь сделать свое написание, все остальное работает нормально, и если вы удалите эти два метода и запустите его как простое чтение программы из файла CSV, он будет работать так, как задумано , Но написание - это то, с чем я сталкиваюсь. IDK, если я могу прикрепить документ, так что для справки вот файл CSV, который я сделал из блокнота:

3,1, Джо

45,0, песчаный

5,1, Мария

12,0, Евгений

11,0, alex

#include <stdio.h>
#include <stdbool.h>


#define NAMESIZE 30
#define ARRAYSIZE 100
#define ROWLENGTH 300
#define TOKENLENGTH 10

typedef struct {
    int nWeeks;
    bool isCensored;
    char identifier[NAMESIZE];
}SurvivalPatientData;




bool giveMeALine(FILE * source, char * dest)
{
    bool status = false;
    char * where = dest;
    char ch;
    int ch_ctr = 0;
    while(((ch = getc(source)) != EOF) && (ch != '\n') && (ch != '\r'))
    {
        *where = ch;
        where++;
        ch_ctr++;
        status = true;
    }
    for (int i=ch_ctr; i<ROWLENGTH && status ;i++)
    {
        *where= '\0'; /*null*/
        where++;
    }
    printf("giveMeALine returning status = %d\n",status);
    return status;
}

bool getTokensFromLineforOutput(char *theLine, SurvivalPatientData *sdp) {
    bool status = false;
    FILE * file = fopen("C:/Users/Default/Desktop/CCSU/CCSU SPRING 18/CS_3//output.txt", "w");
    char * inTheLine = theLine;
    char theToken[TOKENLENGTH];
    char * inToken = theToken;

    char ch = '\0';
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    int value = 0;
    while((ch=*inTheLine)!=',')
    {
        value *= 10;
        value += ch - '0';
        inTheLine++;
    }
    sdp->nWeeks=value;
    fprintf(file, "%d\n",sdp->nWeeks);
    inTheLine++;
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    inToken = theToken;
    inTheLine++;
    while((ch=*inTheLine)!=',')
    {
        *inToken = ch;
        inToken++;
        inTheLine++;
    }
    inToken--;
    if (*inToken == '0')
    {
        sdp->isCensored=false;
    }
    else
    {
        sdp->isCensored= true;
    }
    fprintf(file, "%d\n",sdp->isCensored);
    inTheLine++;
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    inToken = sdp->identifier;
    while((ch=*inTheLine)!=',' && ch!= EOF)
    {
        *inToken = ch;
        inToken++;
        inTheLine++;
    }
    status=true;
    return status;
}

bool getTokensFromLine(char * theLine,
                       SurvivalPatientData * sdp);

bool getTokensFromLine(char *theLine, SurvivalPatientData *sdp) {
    bool status = false;

    char * inTheLine = theLine;
    char theToken[TOKENLENGTH];
    char * inToken = theToken;
    char ch = '\0';
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    int value = 0;
    while((ch=*inTheLine)!=',')
    {
        value *= 10;
        value += ch - '0';
        inTheLine++;
    }
    sdp->nWeeks=value;
    printf("Weeks is %d\n",sdp->nWeeks);
    inTheLine++;
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    inToken = theToken;
    inTheLine++;
    while((ch=*inTheLine)!=',')
    {
        *inToken = ch;
        inToken++;
        inTheLine++;
    }
    inToken--;
    if (*inToken == '0')
    {
        sdp->isCensored=false;
    }
    else
    {
        sdp->isCensored= true;
    }
    printf("isCensored is %d\n",sdp->isCensored);
    inTheLine++;
    for (int i = 0; i<TOKENLENGTH; i++)
    {
        theToken[i]='\0'; /*null char*/
    }
    inToken = sdp->identifier;
    while((ch=*inTheLine)!=',' && ch!= EOF)
    {
        *inToken = ch;
        inToken++;
        inTheLine++;
    }
    printf("The identifier is %s\n",sdp->identifier);
    status=true;
    return status;
}

bool writeOutput(FILE * source, SurvivalPatientData * gotIt){
    bool status = false;
    bool write = false;

    for (int j = 0; j<ARRAYSIZE; j++){
        for (int i = 0; i<NAMESIZE; i++){
            (gotIt[j].identifier)[i]='\x20';
        }
        gotIt[j].nWeeks = 0;
        gotIt[j].isCensored = false;
    }
    int nrows = 0;
    int row = 0;
    char readALine[ROWLENGTH];
    bool lines2Read = true;
    bool gotTokens = false;

    while (lines2Read){
        bool gotALine = giveMeALine(source, readALine);
        if(!gotALine){
            lines2Read = false;
        } else {
            gotTokens = getTokensFromLineforOutput(readALine, &(gotIt[row]));

            if(gotTokens){
                status = true;
                row++;
                nrows++;
            }
        }
    }
    return status;
}


bool getInputFancy(FILE * source, SurvivalPatientData * gotIt){
    bool status = false;
    for (int j = 0; j<ARRAYSIZE; j++){
        for (int i = 0; i<NAMESIZE; i++){
            (gotIt[j].identifier)[i]='\x20';
        }
        gotIt[j].nWeeks = 0;
        gotIt[j].isCensored = false;
    }
    int nrows = 0;
    int row = 0;
    char readALine[ROWLENGTH];
    bool lines2Read = true;
    bool gotTokens = false;

    while (lines2Read){
        bool gotALine = giveMeALine(source, readALine);
        if(!gotALine){
            lines2Read = false;
        } else {
            puts(readALine);
            gotTokens = getTokensFromLine(readALine, &(gotIt[row]));

            if(gotTokens){
                printf("found %d row\n", row);
                status = true;
                row++;
                nrows++;
            }
        }
    }
            printf("found %d rows\n", nrows);
            return status;
}


int main() {
    printf("Hello, World!\n");
    bool readIt = false;
    bool write = false;
    SurvivalPatientData gotIt[ARRAYSIZE];
    FILE * whereInputIs = fopen("C:/Users/Default/Desktop/CCSU/CCSU SPRING 18/CS_3//retake.csv", "r");
    FILE * whereOutputIs = fopen("C:/Users/Default/Desktop/CCSU/CCSU SPRING 18/CS_3//output.txt", "w");
    if (whereInputIs == NULL){
        perror("can't open file source/doesn't exist");
    }
    puts("Found the file");
    readIt = getInputFancy(whereInputIs, gotIt);
    write = writeOutput(whereOutputIs, gotIt);
    if (!readIt)
    {
        perror("could not read that file");
    }
    puts("!!!read the file!!!");

    if (fclose ( whereInputIs) != 0) {
        perror("trouble trying to close");
    }
    puts("!!!closed the file!!!");



    return 0;
}

1 Ответ

0 голосов
/ 25 апреля 2018

(Если бы я мог прокомментировать это, я бы)

Попробуйте поставить круглые скобки вокруг ссылки на переменную * и переменной ..

(ch = (*inThLine)) 
...