2016-06-28 67 views
0

程序说明:所以我得到了一个名为“file.txt”的文件,并且两个指针指向同一个文件f1和f2。复制字符串时出现问题,打开文件时

我想要做一些改变file.txt当标志= 1,并且当标志的其他变化= 0

更多specificly:(如果标志= 1,与第二列改变对角矩阵,如果标志= 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); 

    } 
} 
+0

复制确切的错误信息到你的问题。 –

+0

'flag'永远不是'0'。由于'f2 = f1;',在'func()'中'f_1'和'f_2'之间没有区别。您只打开了一次文件,而在'f_1'上操作的任何内容也都发生在'f_2'上,因为它们只是同一个对象的两个名称。 – axiac

+0

请向我们展示一个[MCVE](http://stackoverflow.com/help/mcve)。 –

回答

0

当你这样做f_1 = f_2,因为f_1FILE*f_2太多,他们会以同样的方式受到影响,因为它是相同的指针。当您在f_2上使用fseek()时,它与在f_1上使用它完全相同,反之亦然。问题是,你不知道你在读什么,然后你不能确定ch_data1里面的内容。

以同样的方式,做fgets(ch_data2, 4, f_2);酷似做fgets(ch_data2, 4, f_1);