仅使用'r'和'w'附加到文件

时间:2014-09-18 03:37:47

标签: c file-io

我有这个问题,我必须将数据附加到文件的末尾。但我应该只使用'r''w'模式。我不能使用'a''a+''w+''r+'模式。

所以我做的是,将文件的内容放在缓冲区中,以'w'模式打开文件,然后执行写操作。之后,将缓冲区的内容写入文件。它工作正常,但是当我使用cat打开文件时,输出不是预期的。我之间可以看到一些垃圾。 代码如下,假设文件已经包含一些数据

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

void main()
{   
    char str[50];
    char abuf[500];
    int szf;
    FILE *fp;

    memset(str, 0, sizeof(str));
    printf("enter string \n");
    gets(str);
    printf("string entered is: %s \n", str);
    memset(abuf, 0, sizeof(abuf));
    printf("done memset \n");
    fp=fopen("smple.txt","r");
    if(fp==NULL) {  fopen("smple.txt","w");  }
    else{
        fseek(fp, 0, SEEK_END);
        printf("done fseek \n");
        szf=ftell(fp);
        printf("done ftell \n");
        fseek(fp, 0, SEEK_SET);
        printf("done fseek set \n");
        fread(abuf, sizeof(char), szf+1, fp);
        printf("abuf is: %s \n", abuf);
        fclose(fp);
        fp=fopen("smple.txt", "w"); 
        fwrite(str, sizeof(str), strlen(str), fp);}
        fwrite(abuf, sizeof(str), strlen(abuf), fp);
        fclose(fp);
    }

1 个答案:

答案 0 :(得分:0)

除了RetiredNinja发表的评论之外,我还补充说你实际上已经尝试过添加数据 - 将数据添加到文件的开头,而不是结尾。 (abuf应该写在str之前的文件中)

由于您没有为abuf动态分配内存,因此您也只有500字节的限制。

我建议如下:

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

int main()
{
    char fileExists = 0;
    long existingLength;
    char *existingData;

    char inputBuffer[1024];
    printf("Enter text: ");
    gets(inputBuffer);

    FILE *output;
    output = fopen("smpl.txt", "r");
    if (output != NULL)
    {
        fseek(output, 0, SEEK_END);
        existingLength = ftell(output);
        existingData = (char*)malloc(sizeof(char) * existingLength);
        fseek(output, 0, SEEK_SET);
        fread(existingData, 1, existingLength, output);
        fclose(output);
        fileExists = 1;
    }

    output = fopen("smpl.txt", "w");

    if (fileExists)
        fwrite(existingData, sizeof(char), existingLength, output);

    fwrite(inputBuffer, sizeof(inputBuffer[0]), strlen(inputBuffer), output);

    fclose(output);
}