2016-06-28 2 views
0

Объяснение программы: Итак, у меня есть файл под названием «file.txt» и два указателя на один и тот же файл, f1 и f2.Проблемы с копированием строк при открытии файла

Я хочу, чтобы сделать некоторые изменения в file.txt, когда флаг = 1, и другие изменения, когда флаг = 0.

Более специфический: (если флаг = 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

'флаг' никогда не' 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_1 является FILE* и f_2 тоже, они будут затронуты таким же образом, так как это тот же самый указатель. Когда вы используете fseek() по адресу f_2, это точно так же, как использовать его на f_1 и наоборот. Проблема в том, что вы действительно не знаете, что читаете, и тогда вы не можете быть уверены в том, что находится внутри ch_data1.

Таким же образом, делая fgets(ch_data2, 4, f_2); точно, как делать fgets(ch_data2, 4, f_1);

Смежные вопросы