读取指定为参数的文件及其 return 行
Read a file specified as an argument and return its' lines
我有一个练习,我必须读取一个包含字符串的文件,我必须 return 使用 one/multiple 数组的内容(这是因为这个练习的第二部分要求这些要反转的行,我在输入时遇到问题 - 因此寻求帮助)。
到目前为止,我有这个:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 1024
int main(int argc, char *argv[]){
char* input[LENGTH];
if(argc==2){
FILE *fp = fopen(argv[1], "rt");
if(fp!=NULL){
int i=0;
while(fgets(input, sizeof(input), fp)!=NULL){
input[i] = (char*)malloc(sizeof(char) * (LENGTH));
fgets(input, sizeof(input), fp);
i++;
}
printf("%s", *input);
free(input);
}
else{
printf("File opening unsuccessful!");
}
}
else{
printf("Enter an argument.");
}
return 0;
}
我还要检查内存分配是否失败。当从命令行 运行 时,该程序的当前形式 return 什么都没有。
编辑:我认为很重要的一点是我收到了很多警告:
passing argument 1 of 'fgets' from incompatible pointer type [-Wincompatible-pointer-types]|
attempt to free a non-heap object 'input' [-Wfree-nonheap-object]|
编辑 2:
输入示例:
These
are
strings
...和预期输出:
esehT
era
sgnirts
练习中指定一行的最大长度为1024
个字符。
你可能想要这样的东西。
评论在代码里
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 1024
int main(int argc, char* argv[]) {
if (argc == 2) {
FILE* fp = fopen(argv[1], "rt");
if (fp != NULL) {
char** lines = NULL; // pointer to pointers to lines read
int nboflines = 0; // total number of lines read
char input[LENGTH]; // temporary input buffer
while (fgets(input, sizeof(input), fp) != NULL) {
char* newline = malloc(strlen(input) + 1); // allocate memory for line (+1 for null terminator)
strcpy(newline, input); // copy line just read
newline[strcspn(newline, "\n")] = 0; // remove \n if any
nboflines++; // one more line
lines = realloc(lines, nboflines * sizeof(char*)); // reallocate memory for one more line
lines[nboflines - 1] = newline; // store the pointer to the line
}
fclose(fp);
for (int i = 0; i < nboflines; i++) // print the lins we've read
{
printf("%s\n", lines[i]);
}
}
else {
printf("File opening unsuccessful!");
}
}
else {
printf("Enter an argument.");
}
return 0;
}
关于删除 fgets
留下的 \n
的说明:Removing trailing newline character from fgets() input
免责声明:
- 内存分配函数没有错误检查
- 内存未释放。这留作练习。
- 这里使用的方式
realloc
效率不是很高
- 你还需要写每行反转显示的代码
您可能应该将其分解为不同的功能:
- 读取文件的函数和returns指向行的指针和读取的行数,
- 一个显示行读取的函数
- 一个反转一行的函数(待写)
- 一个将所有行反转的函数(待写)
这留作练习。
我有一个练习,我必须读取一个包含字符串的文件,我必须 return 使用 one/multiple 数组的内容(这是因为这个练习的第二部分要求这些要反转的行,我在输入时遇到问题 - 因此寻求帮助)。 到目前为止,我有这个:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 1024
int main(int argc, char *argv[]){
char* input[LENGTH];
if(argc==2){
FILE *fp = fopen(argv[1], "rt");
if(fp!=NULL){
int i=0;
while(fgets(input, sizeof(input), fp)!=NULL){
input[i] = (char*)malloc(sizeof(char) * (LENGTH));
fgets(input, sizeof(input), fp);
i++;
}
printf("%s", *input);
free(input);
}
else{
printf("File opening unsuccessful!");
}
}
else{
printf("Enter an argument.");
}
return 0;
}
我还要检查内存分配是否失败。当从命令行 运行 时,该程序的当前形式 return 什么都没有。
编辑:我认为很重要的一点是我收到了很多警告:
passing argument 1 of 'fgets' from incompatible pointer type [-Wincompatible-pointer-types]|
attempt to free a non-heap object 'input' [-Wfree-nonheap-object]|
编辑 2: 输入示例:
These
are
strings
...和预期输出:
esehT
era
sgnirts
练习中指定一行的最大长度为1024
个字符。
你可能想要这样的东西。
评论在代码里
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 1024
int main(int argc, char* argv[]) {
if (argc == 2) {
FILE* fp = fopen(argv[1], "rt");
if (fp != NULL) {
char** lines = NULL; // pointer to pointers to lines read
int nboflines = 0; // total number of lines read
char input[LENGTH]; // temporary input buffer
while (fgets(input, sizeof(input), fp) != NULL) {
char* newline = malloc(strlen(input) + 1); // allocate memory for line (+1 for null terminator)
strcpy(newline, input); // copy line just read
newline[strcspn(newline, "\n")] = 0; // remove \n if any
nboflines++; // one more line
lines = realloc(lines, nboflines * sizeof(char*)); // reallocate memory for one more line
lines[nboflines - 1] = newline; // store the pointer to the line
}
fclose(fp);
for (int i = 0; i < nboflines; i++) // print the lins we've read
{
printf("%s\n", lines[i]);
}
}
else {
printf("File opening unsuccessful!");
}
}
else {
printf("Enter an argument.");
}
return 0;
}
关于删除 fgets
留下的 \n
的说明:Removing trailing newline character from fgets() input
免责声明:
- 内存分配函数没有错误检查
- 内存未释放。这留作练习。
- 这里使用的方式
realloc
效率不是很高 - 你还需要写每行反转显示的代码
您可能应该将其分解为不同的功能:
- 读取文件的函数和returns指向行的指针和读取的行数,
- 一个显示行读取的函数
- 一个反转一行的函数(待写)
- 一个将所有行反转的函数(待写)
这留作练习。