C:打开的文件太多

标签 c windows windows-7 fopen

这段代码打开一个目录,对于目录中的每个文件,它循环遍历文件内的每一行数据,然后解析它以进行一些计算,并将结果数据输出到一个新文件中。

问题是我最多只能输出大约 1021 个文件。输出所有数据后,我将关闭所有 fopens,所以我不确定我做错了什么。

不应该 fclose() 关闭打开的文件,因此不会发生这种情况吗?

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

 //sample data values
  double lat;
  double lon;  
  double convergence;   
  double pt_scale;        
  int    zone = 54;              
  double major_axis = 6378137.0000;        
  double flattening = (1/298.2572);        
  double zoneWidth = 6;         
  double centMeridian = -177;      
  double falseEast = FALSE_EASTING;         
  double falseNorth = FALSE_NORTHING;
  double scale = SCALE_FACTOR;  

  int max_size = 128;
  int current_size = max_size;
  char *pathStr = malloc(max_size);
  char *outPathStr = malloc(max_size);
  char coData[100]; //max length of line;
  long firstTerm, secondTerm; //terms we will split the line into, lat, lon, elevation.
  int counter = 0; //pos counter
  int d = EOF; //end of file ASCII
  char strIn[200];
  char* elevation;
  char strOut[200];
  char dirOut[200]; //sprintf must use a actual defined buffer otherwise there will be a buffer overflow.
  char* cchr;
  int j;
  _setmaxstdio(2048);
  printf("Please enter the path of the files: \n");
  getUserInput(pathStr, current_size, max_size); 
  printf("Please enter the output path of the files: \n");
  getUserInput(outPathStr, current_size, max_size);
  //loop through each file in the directory. Open the file, convert, then close it.
  //we will use dirent.h as it is cross platform so we wont have to worry about sharing issues
  DIR *dir; //new directory
  struct dirent *ent;
  dir = opendir(pathStr); //allcate it a path
  if(opendir(pathStr) == NULL)
  { printf("Error: %d (%s)\n", errno, strerror(errno));}
  int k;

  if(dir != NULL)
  {

         while((ent = readdir(dir)) != NULL) //loop through each file in the directory.
         {
                    //open the file and loop through each line converting it then outputing it into a new file
                if((!strcmp(ent->d_name,"..") || !strcmp(ent->d_name,".")) == 1)
                {
                        //dont want these directories
                        continue;
                }
                else
                {
                sprintf(strIn,"%s%s",pathStr,ent->d_name);    //get the file n
                FILE *fp = fopen(strIn, "r");
                if(fopen(strIn, "r") == NULL) //for inputting file
                { printf("Error: %d (%s)\n", errno, strerror(errno));
                                getchar();
                                  break; }

                sprintf(dirOut,"%s%d%s",outPathStr,counter,".geo");
                printf("%s \n",dirOut);
                FILE *fp2 = fopen(dirOut, "w"); //for outputting file
                if(fopen(dirOut, "w") == NULL)
                     { printf("Error: %d (%s)\n", errno, strerror(errno));
                      getchar();
                      break; }


                     while(fgets(coData, 100, fp) != NULL)//loop through line by line, allocate into 2 doubles and a string, pass the two coordinates and convert
                     {
                        //extract terms from coData                
                        char * pch; //pointer to array pos
                        char * pend;                          
                        pch = strtok(coData," ");                          
                        j = 0;

                            while(j <= 2) //We only want to split the first three parameters.
                            {
                                    //convert char array to double for co-oridinate conversion  

                                    if(j == 0)
                                    {
                                    firstTerm = atof(pch);         //latitude;           
                                    j++;
                                    continue;
                                    }
                                    if(j == 1)
                                    {
                                    pch = strtok(NULL, " ");
                                    secondTerm = atof(pch); //longitude
                                    j++;
                                    continue;
                                    }
                                    if(j == 2)
                                    {
                                    pch = strtok(NULL," ");
                                    elevation = pch; //elevation doesnt need to be converted because it isnt used in the coordinate conversion.
                                    break;
                                    }                                                               
                            }
                       grid2spheroid(&lat,&lon,&convergence,&pt_scale,firstTerm,secondTerm,zone,0, major_axis,flattening,zoneWidth,centMeridian,falseEast,falseNorth,scale);                                            
                       sprintf(strOut,"%f %f %s",lat,lon,elevation);
                       //printf("%d %d", lat, lon);                          
                       fputs(strOut,fp2);


                     }     //end of while        

                      fclose(fp2);
                      fclose(fp);
                      counter++;
                 }

                }
                closedir(dir);
  }
  free(pathStr); //finished using the path string so we can finish the 
  free(outPathStr);
  getchar(); 
  return 0;

 }

  void getUserInput(char *pathStr, int current_size, int max_size)
 {
 unsigned int i = 0;
 if(pathStr != NULL)
  {
              int c = EOF;

              //get the user input and reallocate the memory size if the input it too large.
              while((c = getchar()) != '\n' && c != EOF) //WHILE NOT END OF FILE OR NEW LINE (USER PRESSED ENTER)
              {
                   pathStr[i++] = (char)c;

                   if(i == current_size)
                   {
                        current_size = i+max_size;
                        pathStr = realloc(pathStr, current_size);
                   }    
              }
  }
}

最佳答案

您没有关闭所有文件;-)

FILE *fp = fopen(strIn, "r");
if(fopen(strIn, "r") == NULL) //for inputting file

这同样适用于您的输出。

我认为你的意思更像是:

FILE *fp = fopen(strIn, "r");
if(fp == NULL) //for inputting file
{
     // error handling.

关于C:打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11446000/

相关文章:

python - 将 Python 的 stdout 传递给写入的 C 函数

c - 如何在 C 编程语言中定义固定大小的数据类型(以位为单位)

windows - 何时以及为何使用 CoLoadLibrary?

windows - 看了很多,还是无法让 Pathogen 在 Windows 下加载插件

c - 那么这2种socket处理方式有什么区别呢?

c - 为什么我不能用 -fPIE 编译但可以用 -fPIC 编译?

.net - 如何防止 ReadDirectoryChangesW 丢失文件更改

delphi - 随着 Alpha 降低,在玻璃背景上绘制的文本变得模糊

java - SWT 不再有句柄 - 在 Windows 7 中

c++ - 带有 GUID 的未解析外部符号 _CLSID_ScenicIntentUIFramework