如何在C中读取和写入文件之间进行更改

时间:2015-12-10 21:22:39

标签: c

我的问题如下:

对于学校,我必须在C中制作一个小程序来创建和修改.txt文件。我已经创建了文件并在其上书写,但是当我从中读取它以在屏幕上打印它从一开始就没有做,然后是" fisical"我的电脑中的文件全部损坏了中文字符...

我不知道发生了什么......这是我的代码:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <unistd.h>
#define SIZE 1

void clrscr()
{
    system("cls");
}

int getLenght(char *Rstring)
{
    int n = 0;
    while(Rstring[n] != '\0')
        n++;
    return n;
}

void getPath(char fname[])
{
    printf("Insert file path: ");
    gets(fname);
    fflush(stdin);
}

// Returns 0 DOESNT EXIST, 1 DOES EXIST
int fileExist(char *fname)
{
    if(access(fname, F_OK) != -1)
        return 1;
    return 0;
}

//if manage file is NULL truncate program
FILE *manageFile(char *fname)
{
    if(fileExist(fname))
        return fopen(fname, "r+");
    else
        return fopen(fname, "w+");
}

//Returns 1 if there's an ERROR 0 if NOT
int readFile(FILE *streamf, char buffer[])
{
    fflush(streamf);
    fseek(streamf, -1, SEEK_SET);
    fread(buffer, SIZE, sizeof(buffer), streamf);
    if(ferror(streamf)){
        clearerr(streamf);
        return 1;
    }
    return 0;
}

//Returns 1 if there's an ERROR 0 if NOT
int writeFile(FILE *streamf, char buffer[])
{
    int NELEMT;
    printf("Insert text to input file:\n");
    gets(buffer);
    fflush(stdin);
    NELEMT = getLenght(buffer);
    fflush(streamf);
    fseek(streamf, 1, SEEK_END);
    fwrite(buffer, SIZE, NELEMT, streamf);
    if(ferror(streamf)){
        clearerr(streamf);
        return 1;
    }
    return 0;
}

int main()
{
    char fname[1000];
    char buffer[1000];
    char choice;
    int CC = 1;
    FILE *streamf = NULL;

    printf("\tFILE MANAGMENT SYSTEM TEST v 1.0\n");
    getPath(fname);
    streamf = manageFile(fname);
    if(streamf == NULL){
        printf("\n\nFILE OPEN ERROR! Terminate Program");
        CC = 0;
    }

    while(CC == 1){
        clrscr();
        printf("\tFILE MANAGMENT SYSTEM TEST v 1.0 - MENU\nCURRENT PATH: %s\n\n", fname);
        printf("1. Read File\n2. Write File\n3. Close File\n");
        choice = getch();
        fflush(stdin);

        switch(choice)
        {
        case '1':
            if(readFile(streamf, buffer))
                printf("\n\nREAD FILE ERROR!");
            else
                printf("Successfully read from the file:\n%s", buffer);
            getch();
            break;
        case '2':
            if(writeFile(streamf, buffer))
                printf("\n\nWRITE FILE ERROR!");
            else
                printf("Successful file input");
            getch();
            break;
        case '3':
            fflush(streamf);
            fclose(streamf);
            CC = 0;
            break;
        default:
            printf("\n\nOPTION NOT LISTED");
            getch();
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您在sizeof(buffer)的通话中使用fread,但它没有按照您的想法行事。看看你如何将buffer传递给readFile

int readFile( FILE *streamf, char buffer[] );

这意味着buffer只是一个指针,因此sizeof(buffer)将等于sizeof(char*)。这是人们用sizeof犯下的经典错误,所以这是你的成年礼。

您需要实际传递大小到您的函数,或重新定义它以接受char buffer[1000]。我会明确地传递一个大小:

int readFile( FILE *streamf, char buffer[], size_t buffer_size );

另外,如评论中所示,您使用的是fseek错误。您需要对0SEEK_SET使用SEEK_END的偏移量。