读取文件并将其存储在结构中,以便可以在其他函数中使用

时间:2017-02-16 20:56:04

标签: c file struct

所以我正在尝试编写一个程序,它将读取一个文件并存储到一个结构中,以便以后可以将它传递给其他函数进行操作等等。但是,当我尝试访问此文件以用于以后的功能时,似乎没有任何存储/缓冲。问题似乎出现在“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++;
    }
}

编辑:现在回过头来看,使用指针代替字符串数组会更好吗?

2 个答案:

答案 0 :(得分:1)

所以即使它有点模糊,我也会尝试回答你的问题。 所以关于你的问题,我不知道你是否正在尝试读出一个充满“Info structs”的文件,或者试图从text / bin文件中读取'x'个char到一个struct中。

首先在代码中看到的一些常见内容。

  • 此函数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)
{
	FILE* fp = fopen(filename, "r");
	if(fp == NULL){//If File pointer is null opening failed
		return -1;
  }
	fseek(fp, 0L, SEEK_END);
	int amountOfStructs = ftell(fp)/sizeof(INFO);
	fseek(fp, 0L, SEEK_SET);
	fclose(fp);
	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)
{
	FILE* fp = fopen(filename, "r");
	if(fp == NULL)
	{
		fclose(fp);
		return -1;
	}
	fseek(fp, (pos * sizeof(INFO)), SEEK_SET);
	int rv = fread(data, sizeof(INFO), 1, fp);
	fclose(fp);
	if(rv == 1)
	{
		return 0;
	}
	return -1;
}

我希望这至少可以帮助您解决代码问题。关于“fgets vs fread”问题已经被另一个问题解决了。 希望我能对你的问题给出一个更完整的答案,但这有点模糊。

P.S。如果社区中的任何人看到我的代码/解释中的错误,请随时编辑或指出我的错误。我是学生,所以总有一些人需要学习。

答案 1 :(得分: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");