2014-12-05 3 views
0

Я читаю данные из предварительно прочитанного файла и сохраняю его в буфере, в котором я прошел через структуру, чтобы организовать данные, а затем повторно сохранить их в другом файле.Чтение нескольких строк данных из файла

Однако я читаю только одну строку кода.

Мой код - Открытие файла:

File *p_file 

char fileLocation[40]; 
char buff[1000]; 

printf("\nEnter file name: \n"); 
scanf("%s, fileLocation); 

p_file = fopen(fileLocation, "r"); 

if(!p_file) 
{ 
    printf("\nError!\n"); 
} 

Loop для чтения данных и сохранить файл

while(fgets(buff, 1000, p_file)!=NULL 
{ 
    printf("%s", buff); 

    storedData.source = atoi(strtok(buff, ":"); 
    storedData.destination = atoi(strtok(0, ":"); 
    storedData.type = atoi(strtok(0, ":"); 
    storedData.port = atoi(strtok(0, ":"); 
    storedData.data = strtok(0, ":\n"); 

    printf("\nEnter a File Name to save:"); 
    scanf("%s", fileLocation); 

if ((p_file = fopen(fileLocation, "w")) == NULL 
{ 
    puts("\n Could not point to the file."); 
}else{ 
    printf("\nSaving"); 
    fprintf(p_file, "%04d:%04d:%04d:%04:%s \n", 
      storedData.source, 
      storedData.destination, 
      storedData.type, 
      storedData.port, 
      storedData.data); 

    fclose(p_file); 
} 
fclose(p_file); 

токовый выход данных:

0001:0002:0003:0021:CLS 

Wanted вывод данных:

0001:0002:0003:0021:CLS 
0001:0010:0003:0021:CLS 
0001:0002:0002:0080:<HTML> 

Я считаю, что я должен объявить целочисленное значение для использования в цикле содержимого файла, а также использовать malloc для получения размера структуры, но я не знаю, как бы я это сделал. Любая помощь будет высоко ценится.

+0

эта строка: в то время как (fgets (бафф, 1000, p_file) = NULL отсутствует завершающую! ')' – user3629249

+0

эта строка: если ((p_file = FOPEN (fileLocation, "ш")) == NULL отсутствует также «trailing»), также используйте другое имя для указателя файла, другое мудрый 1) не сможет больше ссылаться на первый файл, 2) не сможет закрыть первый файл. 3) нужно только открыть выходной файл один раз, поэтому поместить вне loo; – user3629249

ответ

1

Вы злоупотребляете p_file файлом для чтения, а также файлом для записи.

if ((p_file = fopen(fileLocation, "w")) == NULL) 

С этим вы теряете указатель на файл, который вы открыли для чтения. И когда вы закрываете его в else, часть fgets() думает, что линий больше нет.

Используйте другую переменную для записи файла.


Если вы хотите работать в буфере данных, то изменить while(fgets()... прочитать все строки, а затем работать на каждой строке. fgets() не будет читать несколько строк.

1

Ваш цикл на самом деле делать то, что только один раз

storedData.data = strtok(0, ":\n");

так что вы просто взять первую строку.

0
FILE *in_file; 
FILE *out_file; 
char fileLocation[40]; 
char buff[1000]; 

printf("\nEnter file name: \n"); 
if(1 != scanf(" %s, fileLocation)) 
{ 
    perror(" scanf failed for input file:); 
    exit(EXIT_FAILURE); 
} 

if(NULL == (in_file = fopen(fileLocation, "r")) 
{ 
    perror("fopen failed for input file"); 
    exit(EXIT_FAILURE); 
} 

printf("\nEnter a File Name to save:"); 
if(1 != scanf(" %s", fileLocation)) 
{ 
    perror("scanf failed for outut file name"); 
    fclose(in_file); // cleanup 
    exit(EXIT_FAILURE); 
} 

if (NULL == (out_file = fopen(fileLocation, "w"))) 
{ 
    perror(" fopen failed for output file"); 
    fclose(in_file); // cleanup 
    exit(EXIT_FAILURE)l 
} 

while(fgets(buff, 1000, p_file)!=NULL)) 
{ 
    printf("%s", buff); 

    storedData.source = atoi(strtok(buff, ":"); 
    storedData.destination = atoi(strtok(0, ":"); 
    storedData.type = atoi(strtok(0, ":"); 
    storedData.port = atoi(strtok(0, ":"); 
    storedData.data = strtok(0, ":\n"); 

    printf("\nSaving"); 
    fprintf(p_file, "%04d:%04d:%04d:%04:%s \n", 
     storedData.source, 
     storedData.destination, 
     storedData.type, 
     storedData.port, 
     storedData.data); 
} // end while 

fclose(in_file); // cleanup 
fclose(out_file); // cleanup 
Смежные вопросы