我的文本文件包含类似的数据 -
(项目)(项目编号)
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;
}
请帮我这个。
答案 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)最后,不要忘记释放任何已分配的内存,并关闭所有打开的文件。您的文件内容现已修改并可读。