程序创建一个文件,但不会写入它

时间:2018-04-24 22:25:03

标签: c file-writing

我是C的新手,但我正在努力学习。我现在正在尝试从csv文件中读取一个程序,并从中获取它的整数,然后将它们写入一个单独的.txt文件中。我不明白为什么它会创建一个文件,但为什么它不会写任何东西。这是代码。在方法'getTokensFromLineforOutput'和'writeOutput'是我尝试写作的地方,其他一切正常,如果你要拿走这两个方法并将它作为一个从csv文件读取的程序运行它按预期运行。但写作是我遇到的地方。 IDK,如果我能够附上一份文件,以供参考,这是我用记事本制作的csv文件:

3,1,乔

45,0,沙质

5,1,玛丽

12,0,eugene

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 :(得分:-1)

(如果我可以评论这个,我会)

尝试将括号括在您的参考*和变量..

(ch = (*inThLine))