如何在C中修改文本文件的内容

时间:2017-08-22 15:08:36

标签: c

我的文本文件包含类似的数据 -
(项目)(项目编号)

mobile 5
book 6
pen 2
laptop 7

我想修改文本文件中没有笔。

例如:我想将笔的计数值减少1。 因此,我的文本文件在操作后应该是这样的:

mobile 5
book 6
pen 1
laptop 7

我尝试使用fscanf和fprintf函数,但它没有用。

#include <stdlib.h>
#include<string.h>
#include<stdio.h> // For exit() function
int main()
{
    int i;
    char c[1000];
    char *str="mobile";
    FILE *fptr;

    if ((fptr = fopen("out.txt", "r+")) == NULL)
    {
        printf("Error! opening file");
        // Program exits if file pointer returns NULL.
        exit(1);         
    }

    // reads text until newline 
    char buf[100];
    int item;
    char* temp[10];
    /*
    for(i=0;i<5;i++)
    {
    fscanf(stdin, "%s %d",buf, &item);
    fprintf(fptr, "%s %d\n",buf, item);
    }
    */
    for(i=0;i<5;i++)
    {
    fscanf(fptr,"%s %d", buf , &item);
    if(strstr(buf,str))
    {
     fprintf(fptr,"%s %d",buf ,item+1);
     }
    }

    fclose(fptr);

    return 0;
}

请帮我这个。

2 个答案:

答案 0 :(得分:0)

FILE *fptr_read;
FILE *fptr_write;
int offset = 0;

    if ((fptr_read = fopen("out.txt", "r")) == NULL)
    {
        printf("Error! Can't open file for reading");
        // Program exits if file pointer returns NULL.
        exit(1);         
    }

    if ((fptr_write = fopen("out.txt", "w")) == NULL)
    {
        printf("Error! Can't open file for writing");
        // Program exits if file pointer returns NULL.
        exit(1);         
    }

当您选择写入文件时,必须将文件中的指针移动到特定文件位置

for(i=0;i<5;i++)
{

fscanf(fptr,"%s %d", buf , &item);

if(strstr(buf,str))
{  
current_pos = ftell(fptr_read)   //gets position of file pointer for the read
fseek(fptr_write, current_pos, SEEK_SET)   //sets file pointer of write to read (basically overwrite at that position)
fprintf(fptr_write,"%s %d",buf ,item-1); //subtract one not add one
}

}

答案 1 :(得分:0)

完整的代码留待你做(包括错误检查),但这里有一组可以使用的步骤。 (有很多选择。)这里的大多数步骤都提供了小代码片段提示:

1)typedef一个结构来匹配已知的文件内容。 (如果文件内容在某些时候发生变化,结构定义可能需要更改):

typedef struct {
   char item[20];//change size as needed
   int qty;
}RECORD;

2)打开文件进行读取,计算文件中的行数。类似的东西:

...
int lineCnt = 0;
do 
{
    ch = fgetc(fptr_read);
    if(ch == '\n')
        lineCnt++;
} while (ch != EOF);
...

3)使用lineCnt创建RECORD的实例:

RECORD *record = calloc(lineCnt, sizeof(*records));

4)使用 fgets(...) 逐行打开文件进行读取,读取文件。使用 strtok(...) 解析每一行,将记录中的项目转换为struct成员:

char line[80];
char *tok;
int count = 0;
while(fgets(line, 80, fptr_read)
{
    tok = strtok(line, " ");
    if(tok)
    {
        strcpy(record[count].item, tok);
        tok = strtok(NULL, " ");
        if(tok)
        {
            record[count].qty = atoi(tok);
        }
    }
}

5)使用整数和/或字符串的正常赋值语句根据需要修改成员值。 (或者正如你所尝试的那样使用 fscanf(...) 。[确实有用。]。)

6)使用例如 sprintf(...) 合成修改记录中的新字符串,打开文件进行写入,并使用 fputs(...) 编写将内容修改为文件:

...
for(i=0;i<lineCnt;i++)
{
   sprintf(line[i], "%s  %d\n", record[i].item, record[i].qty);
   fputs(line, fptr_write); 
}
...  

7)最后,不要忘记释放任何已分配的内存,并关闭所有打开的文件。您的文件内容现已修改并可读。