Документ взят из кэша поисковой машины. Адрес оригинального документа : http://wasp.phys.msu.ru/forum/lofiversion/index.php?t648.html
Дата изменения: Unknown
Дата индексирования: Mon Apr 11 08:45:37 2016
Кодировка: Windows-1251
Студенческий форум Физфака МГУ > Чтение в массив строк
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение в массив строк
Студенческий форум Физфака МГУ > Физфак и учеба > Экзамены, зачеты, лекции, семинары, физпраки
eX106
HELP ME

Есть файл в нем:
строка1
строка2
...
строка(n)

надо считать их в массив строк.На Си.
Поможите пожалуйста третий день сижу.... 198.gif 198.gif 198.gif 198.gif 198.gif
l0r0k
си или си++?


лови на ++ лень мне счас ANSI.....
Код
#include <iostream>
#include <string>

int main (int argc, char *argv[]) {

if (argc < 2) {
exit(1)
}

ifstream file_s(argv[1]);
string string_s[2048];
char data[255];
const char *string_c[2048];

while (file) {
file_s.getline(data,255);
string_s[i].assign(data, 0, 255);
string_c[i] = string_s[len].c_str(); // эт в си-строку преобразовал
i++;
}

}




тьфу... не увидел что ты написал на си, счас



Код
#include <stdio.h>

int main(int argc, char *argv[]) {

int i = 0;
char string_c[255][2048];
/* хотя по-хорошему надо сначала прочитать сколько строк в файле а потом уже используя new созадать переменную правильного размера */

if (argc < 2) {
exit(1);
}




FILE * f;
if (!(f = fopen(argv[1], "r"))) {
exit(1);
}

while (!feof(f)) {
fread(string_c[i], 255, f);
i++;
}

/*
массив размером 2048 на 255: 2048 макс строк в нем и 255 символов в строке.
это не прога а полуфабрикат, добавь проверку на невылазанье из границы массива
*/



}
eX106
НЕ фурычит прога. Вообще надо двумерный динамический массив [кол-во строк][кол-во символов в строке] и на том спасибо.
Вот я написал как:
Код
#include<stdio.h>
#include<conio.h>

int main()
{
    FILE *fin;

    char stroka[100];

    int i=0;

    fin=fopen("d:\\file_in.txt","r");

    while(fgets(stroka,100,fin)!=NULL)
    {    
printf("%s",stroka);
i++;
    }    
    printf("\nChislo strok v faile ravno %d \n",i);

    char string_c[255][2048];

    while (!feof(fin))
    {
fread(string_c[i], 255, fin);
// Тута у функции должно быть 4 параметра.
i++;
    }

    for(int number=0;number<i;number++)
    {
printf("stroka nomer %d imeet vid %s :/n",number,stroka[i]);
    }
    return 0;
}


pardon.gif 194.gif

Bot: хахаха код лучше в теге CODE писать ну ты дал happydance.gif
Doctor
Так. Написал. Чистый С, динамическая память, тестировал.
У меня кнопка "CODE" куда-то делась, просьба к модератору поправить.

--------------------------------------------------------------------
Код
//Тестировано на Borland C++ 3.1, C compiler
//В С операторы new/delete не работают
//Зато там есть malloc и free - плохие аналоги
//Если вы пишете на С++ - НЕ СОВЕТУЮ писать так, глючит и тормозит
==============FILEREAD.C===========================
//В С include не обязательно
#define MAXSTR 4096 //максимум строк файла
#define MAXSYMB 2048//максимум символов с строке

#pragma please //Теоретически ничего не делает. Но если очень попросить...

void main()
{
    FILE * input; //Заводим указатель на файл
    char * tmpstr;//Заводим временную строку
    char *a[MAXSTR]; // Заводим MAXSTR указателей, это не много кушает
    long int k; //Переменная
    long int i=0;//Счетчик
    long int j=0;//Счетчик
    tmpstr=malloc(MAXSYMB);
    //Даем временной строке до ига места. Не забыть потом отобрать...

    input=fopen("C:\\console\\console.bat", "rt");//Открываем файл
    if(input==NULL)
    //Если файл не открылся - послать кого-то куда-то
    {
fclose(input);
printf("\nSorry, can't find the file");
exit(1);
    }
    i=0;//Она и так 0, но на всякий случай...
    while(!(feof(input)))
    //Пока липка не спопнется (в смысле файл не кончится)...
    {
fgets(tmpstr, MAXSYMB, input);//Читаем строку
if(feof(input))break; //Если файл уже давно кончится - вырубится
//ВНИМАНИЕ! Несмотря на всю странность, эта строка ВАЖНА!
//Ее НЕ СТОИТ удалать
k=strlen(tmpstr);//Считаем, сколько в этой строке байт
a[i]=malloc(k+1);
//Заводим в a на один больше (не забыть про последний 0)
strcpy(a[i], tmpstr);//Переписываем туды эту строку
i++;// Следующий, пожалуйста!
    }
    free(tmpstr);//Освободить те MAXSYMB байт, которые забрали для tmpstr
    fclose(input);//Закрыть файл

    flushall();
    //Не знаю что делает (что-то типа очистки потоков), но без нее не пашет

    for(j=0;j<i;j++)//Распечатка файла
    {
printf("\n[%4li]: %s", j, a[j]);
    }
}


--
Всем удачи!

: eX106, ты сменил картинку. Здорово!
eX106
Спасибо за помощь, други !! drinks.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2016 IPS, Inc.