2016-06-28 65 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);