在C中使用fgets读取文件

r1zhe5dt  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(123)

我试图通过给定的文件读取然后标记它.唯一的问题im有是fgets.文件打开没有收到任何错误.我在网站上的其他地方看到了这一点,但是无论我如何设置,包括设置fileLine到一个像(char fileline [200])这样的设置量,我得到一个分段错误.提前感谢任何帮助.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

 int main(int argc, char *argv[]){
    char *fileName = "0";
    char *tokenize, *savePtr;
    struct Record *database= malloc(sizeof(database[0]));
    int recordNum =0;
    char *fileLine = malloc(sizeof(char *));//have replaced with fileline[200] still didnt work
    FILE *fd = open(fileName,O_RDWR);
    if(fd< 0){
        perror("ERROR OPENING FILE");
    }

    while(fgets(fileLine,200,fd) !=NULL){
        printf("%s\n", fileLine);
        tokenize = strtok_r(fileLine,",",&savePtr);
        while(tokenize != NULL){
         //TOKENIZING into a struct
        }
}
ykejflvf

ykejflvf1#

为什么要将open()FILE一起使用?请改用fopen()

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *fileName = "test.txt";
  char *tokenize, *savePtr;
  char fileLine[200] = {0}; // init this to be NULL terminated
  FILE *fd = fopen(fileName, "r");
  if (fd == 0) { // error check, equal to 0 as iharob said, not less than 0
    perror("ERROR OPENING FILE");
    return -1;
  }

  while (fgets(fileLine, 200, fd) != NULL) {
    printf("%s\n", fileLine);
    tokenize = strtok_r(fileLine, ",", &savePtr);
    while (tokenize != NULL) {
      tokenize = strtok_r(NULL, ",", &savePtr); // do not forget to pass NULL
      //TOKENIZING into a struct
    }
  }
  fclose(fd);

  return 0;
}

正如Weather Vane所说,如果使用open(),则fd < 0可以工作。但是,对于fopen(),您应该检查指针是否为NULL,等价于fd == 0
打开文件的这些函数之间的比较可以在以下中找到:

  1. open and fopen function
  2. C fopen vs open
    我的想法是fopen()是更高级别的。
x4shl7ld

x4shl7ld2#

这条线

char *fileLine = malloc(sizeof(char *));

char *类型分配内存,4或8字节(取决于平台)。
所以当你这么做的时候

fgets(fileLine,200,fd)

它期望有200字节的可用存储器。
试试这个:

char *fileLine = malloc(200);
if (fileLine == NULL) { ... }   // check for error

其将分配所需的存储器。

vbkedwbf

vbkedwbf3#

您正在使用open()而不是fopen()
您不能确定文件是否正确打开,因为fopen()不返回整数,而是返回指向FILE *对象的指针,失败时返回NULL,因此正确的条件是

FILE *file;

file = fopen(filename, "r");
if (file == NULL)
 {
    perror("fopen()");
    return -1;
 }

在代码中,即使fopen()失败,您仍然使用fgets(),在这种情况下,您应该中止程序。
另外,malloc()将字节数作为大小参数,因此如果希望fgets()仅读取count字节,则malloc()应为

char  *buffer;
size_t count;

count  = 200; /* or a value obtained someway */
buffer = malloc(count);
if (buffer == NULL)
 {
    fclose(file);
    perror("malloc()");
    return -1;
 }

如果启用编译警告,编译器将指出代码中的所有问题。

相关问题