2017-02-16 17 views
0

Так что я пытаюсь написать программу, которая будет читать файл и хранить в структуре, чтобы впоследствии она могла быть передана другим функции для манипуляции и многое другое. Однако, когда я пытаюсь получить доступ к этому файлу для последующих функций, кажется, что ничего не было сохранено/буферизовано. Проблема, похоже, связана с функцией «void readFile». Вот то, что я до сих пор: входЧтение файла и его сохранение в структуре, чтобы его можно было использовать во всех других функциях

Пример: Мэри был маленький ягненок,
Мэри был барашек, которого шерсть была белой, как снег.

Моя отладка напечатала это правильно, однако с повторением последней строки.

struct info{ 
    int numOfLines; 
    char lines[]; 
} 

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

    int words, sentences, syllables; 
    int index = 0; 
    struct info lines[200]; 
    FILE* inFile = NULL; 
    inFile = findFile(argv[1]); 
    readFile(inFile,lines); 
    fclose(inFile); 
    return 0; 
} 
FILE* findFile(char fileName[]){ 

    FILE* fileIn = NULL; 
    fileIn = fopen(fileName, "r"); 

    while(fileIn == NULL){ 
    printf("That file does not exist or was unable to be found, please enter another\n"); 
    fgets(fileName,100,stdin); 
    fopen(fileName, "r"); 
    } 

    return fileIn; 
} 

void readFile(FILE* toRead, struct info lines[]){ 
    char sentence[200]; 
    int i = 0; 

    while(!feof(toRead)){ 
     fgets(sentence,300,toRead); //Would this be better than fread()? 
     strcpy(lines[i].lines,sentence); 
     printf("%s",lines[i].lines);  //*This is a debug statement. The lines are read properly except the last line is printed twice. not sure why. 
     i++; 
    } 
} 

Edit: оглядываясь на него сейчас, бы это было лучше использовать указатели для этого вместо массива строк?

ответ

0
fgets(fileName,100,stdin); 
fopen(fileName, "r"); 

fgets включает символа новой строки, удалите ее перед использованием fopen:

char *ptr; 
fgets(fileName,100,stdin); 
if (ptr = strchr(filename, '\n') { 
    *ptr = '\0'; 
} 

также отметить, что вам нужно

fileIn = fopen(fileName, "r"); 

вместо

fopen(fileName, "r"); 
+0

В дополнение к этому в конце 'struct info' отсутствует пространство, выделенное для массива строк. Вместо объявления массива 'struct info', он должен объявить массив' struct info * 'и выделить пространство за пределами размера структуры для размещения строки. Например. 'struct info * lines [200];' и 'lines [i] = malloc (sizeof (struct info) + 100' –

1

S o Я постараюсь ответить на ваш вопрос, хотя это немного расплывчато. Так что в отношении вашего вопроса я не знаю, пытаетесь ли вы прочитать файл, который заполнен «Info-структурами» или пытается прочитать количество символов «x» в структуре из файла text/bin.

Прежде всего, некоторые общие вещи, которые я вижу в вашем коде.

  • Эта функция FILE* findFile(char fileName[]) не нужна. Насколько я вижу, вы пытаетесь проверить, существует ли файл. Вы можете сделать это, используя «acces()», эта функция проверяет, имеет ли вызывающий процесс доступ к имени пути к файлу. Реализация будет выглядеть так: If(access(pathOfFile, F_OK) == 0){}. Прочтите эту ссылку для получения дополнительной информации https://linux.die.net/man/2/access.
  • Следующие фрагменты кода char sentence[200];fgets(sentence,300,toRead); //Would this be better than fread()?, вы объявляете массив символов размером 200, затем вы пытаетесь прочитать из него файл, но количество, которое вы пытаетесь прочитать, равно 300, поэтому это никогда не будет работать, потому что вы будете писать за пределами ваш массив. Совет читает «man» страницы, вы можете это сделать, введя в свой linux терминал «man fread», замените fread на другие имена функций. Как «доступ».

Эти два пункта я хотел прояснить. Что касается вашего вопроса, я приведу вам пример чтения структур из файла. Потому что ваш вопрос So I am trying to write a program that will read a file and store into a struct, such that it can be later on passed to other functions for manipulation and whatnot. немного расплывчатый, если вы пытаетесь прочитать только некоторые символы из файла или структур. Поэтому я переписал вашу программу для чтения структур из файла, полного INFO-структур, в массив, который вы затем можете использовать для управления.

Фрагмент кода чтения данных из файла структур в массив структур

#include <stdio.h> 
 
#include <unistd.h> 
 

 
#define file_name "Foo_File" 
 

 
struct INFO{ 
 
    char ar[200]; 
 
} 
 

 
int main (int argc, char * argv[]){ 
 
    if(access(file_name, F_OK) != 0{ 
 
    printf("File does not exist"); 
 
    return -1;//Exit program with -1, error 
 
    } 
 
    int structs = get_Amount_Of_Structs(file_name); 
 
    INFO info_array[structs];//Make an array of info structs, same amount of structs as in file 
 
    for(int i = 0; i < structs; i++){ 
 
    readDataStructFromFile(file_name, info_array, i); 
 
    } 
 
    return 0; 
 
} 
 

 
/* 
 
    This function will calculate the total byte size of the  file by diving this through the byte size of one struct  you are able to know the amount of structs. 
 
*/ 
 
int get_Amount_Of_Structs(char* filename) 
 
{ 
 
\t FILE* fp = fopen(filename, "r"); 
 
\t if(fp == NULL){//If File pointer is null opening failed 
 
\t \t return -1; 
 
    } 
 
\t fseek(fp, 0L, SEEK_END); 
 
\t int amountOfStructs = ftell(fp)/sizeof(INFO); 
 
\t fseek(fp, 0L, SEEK_SET); 
 
\t fclose(fp); 
 
\t return amountOfStructs; 
 
} 
 

 
/* 
 
    This function reads a struct from a file at the position  "pos" by slight modification you can make it read the  whole file into a pointer that points to an array of INFO structs 
 
*/ 
 
int readDataStructFromFile(char* filename, INFO* data, int pos) 
 
{ 
 
\t FILE* fp = fopen(filename, "r"); 
 
\t if(fp == NULL) 
 
\t { 
 
\t \t fclose(fp); 
 
\t \t return -1; 
 
\t } 
 
\t fseek(fp, (pos * sizeof(INFO)), SEEK_SET); 
 
\t int rv = fread(data, sizeof(INFO), 1, fp); 
 
\t fclose(fp); 
 
\t if(rv == 1) 
 
\t { 
 
\t \t return 0; 
 
\t } 
 
\t return -1; 
 
}

Я надеюсь, что это по крайней мере, поможет вам решить ваши проблемы с вашим кодом. Что касается вопроса «fgets vs fread», вопрос уже разрешен другим. Жаль, что я мог бы дать более полный ответ на ваш вопрос, но там это немного расплывчато.

p.s. Если кто-либо из сообщества видит ошибки в моем коде/объяснении, не стесняйтесь редактировать или указывать мои ошибки. Я студент, поэтому всегда есть возможность учиться.

+0

Файл, который я пытаюсь прочитать, - это просто детская стишка, ее не следует хранить в информационных целях, если это очищает вещи. По сути, я хочу прочитать стихотворение для детей, затем пересчитать все предложения и слова и т. д. –