从文件读取到字符串数组,C

时间:2020-05-01 15:59:47

标签: c

我正在尝试编写一个函数,该函数使用fgets()将文件中的字符串读取为字符串数组,但是我在运行时始终得到std::vector<int> numbers; int temp = 0; while (std::cin >> temp) { numbers.push_back(temp); }

这是我的代码:

zsh: segmentation fault

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的代码几乎正确。

错误:

  1. read函数items++中,错误的是,这会增加 pointer ,但是您想增加指针所指向的变量,因此需要{{ 1}}。

  2. 取决于平台(*items)++将与posix read函数冲突。


程序在以下情况下将失败:

  1. 如果文件read不存在,则strings.dat将是in,并且对NULL NULL指针进行文件操作将导致未定义的行为,通常表现为出现段故障。这可能是您发生的事情。

  2. 如果文件包含50行以上,则您将溢出FILE,这也会导致行为未定义

  3. 如果文件中的行超过31个字符,则行将被截断和/或分割。


奖金:

不需要temp变量,您可以直接读入数组:

代替此:

strarr

您可以拥有:

 char temp[31];
 while (fgets(temp, len, in) != NULL) {
    strcpy(arr[i], temp);
    ...

带有更正的最终代码:

 while (fgets(arr[i], len, in) != NULL) {
    ...

#include <stdio.h> #include <stdlib.h> #include <string.h> void read(FILE*, char[][31], int*, int); void printAll(char[][31], int*); int main(int argc, char** argv) { FILE* in = fopen("strings.dat", "r"); if (in == NULL) { printf("file does not exist\n"); exit(1); } char strarr[50][31]; int items = 0; read(in, strarr, &items, 31); printAll(strarr, &items); } void read(FILE* in, char arr[][31], int* items, int len) { int i = 0; while (fgets(arr[i], len, in) != NULL) { i++; (*items)++; } } void printAll(char arr[][31], int* items) { for (int i = 0; i < *items; i++) { printf("String %d: %s\n", i + 1, arr[i]); } } 的替代版本

read

更短:

void read(FILE* in, char arr[][31], int* items, int len) {
  int i = 0;
  while (fgets(arr[i++], len, in) != NULL) {
    (*items)++;
  }
}