我一直在为我的CIS类做一个小练习,对于C用来读取文件的方法感到非常困惑.我真正需要做的就是逐行读取文件,并使用从每行收集的信息进行一些操作.我try 使用getline方法和其他方法,但没有成功.

int main(char *argc, char* argv[]){
      const char *filename = argv[0];
      FILE *file = fopen(filename, "r");
      char *line = NULL;

      while(!feof(file)){
        sscanf(line, filename, "%s");
        printf("%s\n", line);
      }
    return 1;
}

现在,我对sscanf方法有一个SEG错误,我不确定原因.我是个彻头彻尾的新手,只是想知道我是不是漏掉了什么大局. 谢谢

推荐答案

在这么少的行中有这么多问题.我可能忘记了一些:

  • argv[0]是程序名,而不是第一个参数;
  • 如果你想读入一个变量,你必须分配它的内存
  • 一个永远不会循环使用feof,一个循环使用IO函数,直到它失败,然后feof用于确定失败的原因,
  • sscanf用于解析一行,如果要解析文件,请使用fscanf,
  • "%s"将在第一个空格处停止,作为?scanf家族
  • 要读取一行,标准函数是fgets,
  • 从Main返回1表示失败

所以

#include <stdio.h>

int main(int argc, char* argv[])
{
    char const* const fileName = argv[1]; /* should check that argc > 1 */
    FILE* file = fopen(fileName, "r"); /* should check the result */
    char line[256];

    while (fgets(line, sizeof(line), file)) {
        /* note that fgets don't strip the terminating \n, checking its
           presence would allow to handle lines longer that sizeof(line) */
        printf("%s", line); 
    }
    /* may check feof here to make a difference between eof and io failure -- network
       timeout for instance */

    fclose(file);

    return 0;
}

C++相关问答推荐

定义_MISIX_C_SAL时,在MacOS上编译失败,并出现奇怪错误

错误:八进制常数中的数字9无效

ARM上的Modulo Sim Aarch 64(NEON)

为指针 struct 创建宏

如何将FileFilter添加到FileDialog GTK 4

与unions 的未定义行为

常数函数指针优化

为什么写入系统调用打印的字符数不正确?

如何将已分配的数组(运行时已知的大小)放入 struct 中?

在C中将通用字符名称转换为UTF-8

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

为什么我不能只在内存地址中添加一个int来寻址任何数组?

如何在GDB中查看MUSL的源代码

无法访问共享目标文件内的共享指针

如何将两个uint32_t值交织成一个uint64_t?

从C中的函数返回静态字符串是不是一种糟糕的做法?

为什么我的旧式&q;函数在传递浮点数时会打印2?

初始化动态分配的布尔二维数组的最佳方法是什么?

如何在 C 中编辑 struct 体中的多个变量