Чтение строк из файла. Проект на C
От: Moonshiner  
Дата: 16.01.13 13:47
Оценка: -1
Добрый день.

Подскажите пожалуйста, стоит задача читать из файла некоторое количество символов (сейчас я читаю 10 символов).

Файл такого вида


-2.91,7.88,2.40,inf,2013-01-14T12:07:48.855,15,0,050f1f00
00,1
-2.97,7.75,2.40,inf,2013-01-14T12:07:49.104,16,0,05101f00
00,1
-2.95,7.82,2.40,inf,2013-01-14T12:07:49.338,17,0,05111f00
00,1
-2.99,7.70,2.40,inf,2013-01-14T12:07:49.588,18,0,05121f00
00,1
-3.06,7.60,2.40,inf,2013-01-14T12:07:49.837,19,0,05131f00
00,1
-3.00,7.71,2.40,inf,2013-01-14T12:07:50.056,20,0,05141f00
00,1
-2.94,7.74,2.40,inf,2013-01-14T12:07:50.305,21,0,05151f00
00,1
-2.90,7.84,2.40,inf,2013-01-14T12:07:50.555,22,0,05161f00
00,1
-2.93,7.78,2.40,inf,2013-01-14T12:07:50.805,23,0,05171f00
00,1
-2.96,7.70,2.40,inf,2013-01-14T12:07:51.054,24,0,05181f00
00,1
-2.91,7.79,2.40,inf,2013-01-14T12:07:51.304,25,0,05191f00
00,1
-2.96,7.69,2.40,inf,2013-01-14T12:07:51.522,26,0,051a1f00
00,1
-3.00,7.61,2.40,inf,2013-01-14T12:07:51.772,27,0,051b1f00
00,1
-3.02,7.57,2.40,inf,2013-01-14T12:07:52.021,28,0,051c1f00
00,1
-3.04,7.53,2.40,inf,2013-01-14T12:07:52.271,29,0,051d1f00
00,1
-3.06,7.50,2.40,inf,2013-01-14T12:07:52.521,30,0,051e1f00
00,1
-3.08,7.47,2.40,inf,2013-01-14T12:07:52.770,31,0,051f1f00
00,1
-3.08,7.47,2.40,inf,2013-01-14T12:07:53.020,32,0,05201f00
00,1
-3.09,7.48,2.40,inf,2013-01-14T12:07:53.269,33,0,05211f00
00,1
-3.07,7.50,2.40,inf,2013-01-14T12:07:53.503,34,0,05221f00
00,1
-3.06,7.51,2.40,inf,2013-01-14T12:07:53.753,35,0,05231f00
00,1
-3.06,7.55,2.40,inf,2013-01-14T12:07:54.003,36,0,05241f00
00,1
-3.07,7.54,2.40,inf,2013-01-14T12:07:54.252,37,0,05251f00
00,1
-3.08,7.51,2.40,inf,2013-01-14T12:07:54.424,38,0,05261f00
00,1
-3.09,7.49,2.40,inf,2013-01-14T12:07:54.673,39,0,05271f00
00,1
-3.09,7.49,2.40,inf,2013-01-14T12:07:54.923,40,0,05281f00
00,1
-3.02,7.58,2.40,inf,2013-01-14T12:07:55.173,41,0,05291f00
00,1
inf,inf,inf,inf,2013-01-14T12:07:55.422,42,0,052a1f0000,1

-3.03,7.56,2.40,inf,2013-01-14T12:07:55.687,43,0,052b1f00
00,1
-2.90,7.74,2.40,inf,2013-01-14T12:07:55.921,44,0,052c1f00
00,1
-2.97,7.67,2.40,inf,2013-01-14T12:07:56.124,45,0,052d1f00
00,1
-2.84,7.93,2.40,inf,2013-01-14T12:07:56.374,46,0,052e1f00
00,1
-2.92,7.85,2.40,inf,2013-01-14T12:07:56.623,47,0,052f1f00
00,1
-2.94,7.81,2.40,inf,2013-01-14T12:07:56.873,48,0,05301f00
00,1
-2.97,7.81,2.40,inf,2013-01-14T12:07:57.091,49,0,05311f00
00,1
-2.96,7.80,2.40,inf,2013-01-14T12:07:57.341,50,0,05321f00
00,1
inf,inf,inf,inf,2013-01-14T12:07:57.591,51,0,05331f0000,1

-2.92,7.80,2.40,inf,2013-01-14T12:07:57.840,52,0,05341f00
00,1
inf,inf,inf,inf,2013-01-14T12:07:58.089,53,0,05351f0000,1

-2.91,7.90,2.40,inf,2013-01-14T12:


Сильно не пинайте за такой код, неопытный я. Как правильно написать условия, чтобы в конце строки и при пустой строчке в буфер записывалась новая строчка и не съедался первый знак? С помощью переменной "a" я хотел делать возврат вроде
in->_ptr=in->_ptr-a

И поставить условие, чтобы при достижении конца строки или если идёт несколько нулей строка считывалась до конца, переходила на новую и записывалась нужная строчка.

Заранее спасибо за помощь.



#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *in, *out;

    char buf[10];
    char tmp;
    char end = '\n';
    int a;
//    int i;
//    i = 0;

    if ((in = fopen("D:\\test\\log.txt","r"))==NULL)
        {
            printf("Ошибка чтения файла.\n");
            exit(1);
        }
    if((out = fopen("D:\\test\\1.txt","w+"))==NULL)
                {
                    printf("Ошибка создания файла.\n");
                    exit(1);
                }
    while(!feof(in))
    {
        a = 0;
        fread(&buf,sizeof(buf),1,in);
        while(tmp !='\n' && !feof(in)){
            tmp = getc(in);
        }
        printf("Конец строки \n");
        if ((tmp = getc(in)) == '\n')
        {
                a++;
        }
        if (a > 2)
        {
            printf("Неверная строка в буфере");
        }
        else
        {
            fwrite(&buf,sizeof(buf),1,out);
            fwrite(&end,sizeof(char),1,out);
        }
    }
    printf("%s",buf);
    fclose(in);
    fclose(out);


    return 0;
}
c project
Re: Чтение строк из файла. Проект на C
От: AleksandrN Россия  
Дата: 17.01.13 07:55
Оценка:
Здравствуйте, Moonshiner, Вы писали:

M>Добрый день.


M>Подскажите пожалуйста, стоит задача читать из файла некоторое количество символов (сейчас я читаю 10 символов).



Добавил комментарии в код.

M>

M>#include <stdio.h>
M>#include <stdlib.h>

M>int main(void)
M>{
M>    FILE *in, *out;

M>    char buf[10];
M>    char tmp;
M>    char end = '\n';
M>    int a;
M>//    int i;
M>//    i = 0;

M>    if ((in = fopen("D:\\test\\log.txt","r"))==NULL)
M>        {
M>            printf("Ошибка чтения файла.\n"); // В консольной программе сообщения об ошибках лучше выводить в stderr. Так-же можно использовать функцию perror(), которая ещё напишет и причину ошибки.
M>            exit(1);
M>        }
M>    if((out = fopen("D:\\test\\1.txt","w+"))==NULL)
M>                {
M>                    printf("Ошибка создания файла.\n");
M>                    exit(1);
M>                }
M>    while(!feof(in))
M>    {
M>        a = 0;
M>        fread(&buf,sizeof(buf),1,in);  // Задача "читать из файла некоторое количество символов" почти выполнена :). Почти - потому, что не проверяется значение, возвращаемое fread().
M>        while(tmp !='\n' && !feof(in)){ // На первой итерации цикла while(!feof(in)) переменная tmp не инициализирована.
M>            tmp = getc(in);
M>        }
M>        printf("Конец строки \n"); // А вот не факт. Т.к. tmp не инициализирована, то там, на первой итерации, может выть всё, что угодно, в том числе и '\n'. В этом случае это будет не конец строки, а середина.
M>        if ((tmp = getc(in)) == '\n')
M>        {
M>                a++;
M>        }
M>        if (a > 2) // В этом месте переменная а всегда будет иметь значение 0 или 1.
M>        {
M>            printf("Неверная строка в буфере");
M>        }
M>        else
M>        {
M>            fwrite(&buf,sizeof(buf),1,out);
M>            fwrite(&end,sizeof(char),1,out);
M>        }
M>    }
M>    printf("%s",buf);
M>    fclose(in);
M>    fclose(out);


M>    return 0;
M>}

M>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.