Как читать и перезаписывать текстовый файл в C?
у меня есть текстовый файл.txt, который читает (для простоты)
this is line one
this is line two
this is line three
опять же для простоты, я просто пытаюсь установить первый символ в каждой строке на "X", так что мой желаемый результат будет
xhis is line one
xhis is line two
xhis is line three
Итак, я открываю текст.txt файл и пытается перезаписать каждую строку с желаемым выходом в тот же текстовый файл. В цикле while я устанавливаю первый символ в каждой строке на "x". Я также устанавливаю переменную "line" равной единице, потому что если она включена первая строка, я хочу перемотать к началу файла, чтобы перезаписать в начале, а не в конце файла. Затем строка увеличивается, поэтому она пропустит перемотку для следующей итерации и должна продолжать перезаписывать 2-ю и 3-ю строки. Он отлично работает для первой линии.
у кого-нибудь есть решения? Кстати, я широко исследовал это как на stackoverflow, так и на других сайтах, и не повезло. Вот мой код, и мой вывод также ниже:
#include <stdio.h>
#include <stdlib.h>
#define MAX 500
int main() {
char *buffer = malloc(sizeof(char) * MAX);
FILE *fp = fopen("text.txt", "r+");
int line = 1;
while (fgets(buffer, 500, fp) != NULL) {
buffer[0] = 'x';
if (line == 1) {
rewind(fp);
fprintf(fp, "%s", buffer);
}
else {
fprintf(fp, "%s", buffer);
}
line++;
}
free(buffer);
fclose(fp);
}
выход:
xhis is line one
this is line two
xhis is line two
e
x
5 ответов
long pos = ftell(fp);//Save the current position
while (fgets(buffer, 500, fp) != NULL) {
buffer[0] = 'x';
fseek(fp, pos, SEEK_SET);//move to beginning of line
fprintf(fp, "%s", buffer);
fflush(fp);
pos = ftell(fp);//Save the current position
}
Я всегда предлагаю использовать другой файл для этого решения kindda.
- читать строку
- поместите x в новый файл в строке и скопируйте остальную часть строки.
- делайте это, пока не получите EOF
- удалить старый файл
- переименовать новый файл
попробуйте это
#include<stdio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char buffer[500],read[50][50];
FILE *fp=fopen("text.txt","r+");
int line =1;
while(fgets(buffer,500,fp)!=NULL){
buffer[0]='x';
printf("\n%d ",line);
puts(buffer);
strcat(read[line-1],(const char*)buffer);
line++;
}
fclose(fp);
FILE *fp1=fopen("text.txt","w");
rewind(fp1);
fprintf(fp1,"%s",read);
return 0;
}
Я разработал это на windows
// file_overwrite.cpp : main project file.
// File opens and write y value to a file
// again reads same file and re-writes y value to a file
#include "stdafx.h"
using namespace System;
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include <conio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int x = 19530;
FILE *fp1 = fopen("D:\Data\BUFF.txt","w+");
if(fp1 == NULL)
printf("File not opening \n");
int y=x;
fprintf(fp1, "%d \n", y);
fclose(fp1);
printf("\n file -> open -> write y value and close");
freopen("D:\Data\BUFF.txt", "w", fp1);
rewind(fp1);
y=100;
fprintf(fp1, "%d \n", y);
printf("\n file -> Reopen -> rewind write y values and close");
fclose(fp1);
getch();
return 0;
}
// overwrite_file.cpp
// File opens and write y value to a file
// again reads same file and re-writes y value to a file
#include "stdafx.h"
using namespace System;
#include<stdio.h>
#include<stdio.h>
#include<string.h> //Include appropriate headers
#include <conio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int x = 19530; // Give any value in the limit
FILE *fp1 = fopen("D:\Data\BUFF.txt","w+"); // open file to write
if(fp1 == NULL) // if the file pointer encounters a null, it may not open neither overwrite
printf("File not opening \n");
int y=x;
fprintf(fp1, "%d \n", y); //print y
fclose(fp1);
printf("\n file -> open -> write y value and close"); // close the file after writing the value of y
freopen("D:\Data\BUFF.txt", "w", fp1); //reopen and rewind file
rewind(fp1);
y=100; // this value of y given within the limits gets printed on the .exe console
fprintf(fp1, "%d \n", y);
printf("\n file -> Reopen -> rewind write y values and close"); // rewind write values and close
fclose(fp1);
getch();
return 0;
}