程序说明:所以我得到了一个名为"file.txt"的文件,以及指向同一个文件的两个指针,f1和f2。
我想在flag = 1时对file.txt
进行一些更改,在flag = 0时进行其他更改。
更具体地说:(如果flag=1,改变矩阵的第二列对角线值,如果flag=0,改变矩阵的第二行对角线值)
问题:我得到运行时错误时复制字符串在这一行:strcpy(ch_data_temp, ch_data1);
(错误提示ch_data1
中存在无效值)
文件的样子: file.txt
001002003
004005006
007008009
我的代码:#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void func(FILE *f_1, FILE *f_2, int flag);
void main()
{
int flag = 1;
FILE *f1, *f2;
f1 = fopen("file.txt", "r+");
if (f1 == NULL)
printf("problem");
f2 = f1;
func(f1, f2, flag);
}
void func(FILE *f_1, FILE *f_2, int flag)
{
char ch_data_temp[4], ch_data1[4], ch_data2[4];
int i, d;
fseek(f_1, 0, SEEK_END);
d = ftell(f_1) / 3;
d = sqrt(d);
fseek(f_1, 0, SEEK_SET);
if (flag == 1)
fseek(f_2, 3 * (d / 2), SEEK_SET);
if (flag == 0)
fseek(f_2, 3 * d*(d / 2), SEEK_SET);
for (i = 0; i<d; i++)
{
fgets(ch_data1, 4, f_1);
fgets(ch_data2, 4, f_2);
strcpy(ch_data_temp, ch_data1);
strcpy(ch_data1, ch_data2);
strcpy(ch_data2, ch_data_temp);
fseek(f_1, -3, SEEK_CUR);
fputs(ch_data1, f_1);
fseek(f_2, -3, SEEK_CUR);
fputs(ch_data2, f_2);
fseek(f_1, 3 * d, SEEK_CUR);
if (flag == 1)
fseek(f_2, 3 * (d - 1), SEEK_CUR);
if (flag == 0)
fseek(f_2, 0, SEEK_CUR);
}
}
当您执行f_1 = f_2
时,由于f_1
也是FILE*
和f_2
,它们将以相同的方式受到影响,因为它是相同的指针。当您在f_2
上使用fseek()
时,它与在f_1
上使用它完全相同,反之亦然。问题是你不知道你在读什么,然后你不能确定ch_data1
里面有什么。
同理,执行fgets(ch_data2, 4, f_2);
与执行fgets(ch_data2, 4, f_1);
完全相同