- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写代码来读取包含 DNA 碱基的大量文本文件,我需要能够提取特定部分。该文件如下所示:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGGGG
...
每行30个字符。
我有一个单独的文件指示这些部分,这意味着我有一个start 值和一个end 值.因此,对于每个 start 和 end 值,我需要在文件中提取相应的字符串。例如,如果我有 start=10,end=45,我需要存储从第一行 (C) 的第 10 个字符开始并结束于单独的临时文件中第二行 (C) 的第 15 个字符。
我尝试使用如下所示的 fread 函数对包含上述几行字母的测试文件进行测试。参数为 start=1,end=90,生成的文件如下所示:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGG™eRV
每次运行都会在最后给出随机字符。
代码:
FILE* fp;
fp=fopen(filename, "r");
if (fp==NULL) puts("Failed to open file");
int start=1, end=90;
char string[end-start+2]; //characters from start to end = end-start+1
fseek(fp, start-1, SEEK_SET);
fread(exon,1, end-start+1, fp);
FILE* tp;
tp=fopen("exon", "w");
if (tp==NULL) puts("Failed to make tmp file");
fprintf(tp, "%s\n", string);
fclose(tp);
我无法理解 fread 如何处理\n 字符,所以我尝试用以下内容替换它:
int i=0;
char ch;
while (!feof(fp))
{
ch=fgetc(fp);
if (ch != '\n')
{
string[i]=ch;
i++;
if (i==end-start) break;
}
}
string[end-start+1]='\0';
它创建了以下文件:TGTTCAGGCTGTCAGATGCTAACCTGGGGTCACTGGGGTGTGCGTGCTGCTCCAGCCTGTTCCAGGATATCAGATGCTCACCTGGGGô
(没有任何换行符,我不介意)。每次运行,我都会得到一个不同的随机字符,而不是“G”。
我做错了什么?有没有办法用 fread 或其他功能来完成它?
提前谢谢你。
最佳答案
我已经修改了您的代码并添加了注释以进行解释。
请仔细阅读。您忽略了错误检查,代码中几乎没有 undefined variable 。
我已经从 if
block 返回失败,goto` 会更合适。
请引用this comment是否将 1 个字符或 2 个字符添加到 start
和 end
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE* fp;
// fp = fopen(filename, "r");
// since the filename is undeclared i have used hard coded file name
fp = fopen("dna.txt", "r");
// Nothing wrong in performing error checking
if (fp == NULL) {
puts("Failed to open file");
return -1;
}
// Make sure start is not 0 if you want to use indices starting from 1
int start = 1, end = 90;
// I would adjust the start and end index by adding count of '\n' or '\r\n' to the start and end
// Here I am adjusting for '\n' i.e 1 char
// since you have 30 chars so hardcoding it.
int m = 1; // m depends on whether it is \n or \r\n
// 1 for \n and 2 for \r\n
--start; --end; // adjusting indexes to be 0 based
if (start != 0)
start = start + (start / 30) * m; // start will be 0
if (end != 0)
end = end + (end / 30) * m; // start will be 93
// lets declare the chars to read
int char_to_read = end - start + 1;
// need only 1 extra char to append null char
// If start and end is going to change, then i would suggest using malloc instead of static buffer
// because compiler cannot predict the memory to allocate to the buffer if it is dependent on external factor
// char string[char_to_read + 1]; //characters from start to end = end-start+1
char *string = malloc(char_to_read + 1);
if (string == NULL) {
printf("malloc failed\n");
fclose(fp);
return -2;
}
// zero the buffer
memset(string, 0, char_to_read + 1);
int rc = fseek(fp, start, SEEK_SET);
if (rc == -1) {
printf("fseek failed");
fclose(fp);
return -1;
}
// exon is not defined, and btw we wanted to read in string.
int bytes_read = fread(string, 1, char_to_read, fp);
// Lets check if there is any error after reading
if (bytes_read == -1) {
fclose(fp);
return -1;
}
// Now append the null char to the end
string[bytes_read] = 0;
printf("%s\n", string);
fclose(fp);
// free the memory once you are done with it
if (string)
free(string);
// Now u can write it back to file.
// FILE* tp;
// tp=fopen("exon", "w");
// if (tp==NULL) puts("Failed to make tmp file");
// fprintf(tp, "%s\n", string);
// fclose(tp);
}
关于c - 在 C 中将文本文件的特定部分作为字符串读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56668075/
这个问题在这里已经有了答案: How to initialize var? (11 个答案) 关闭 8 年前。 我想给一个变量赋初值 null,并在下一个 if-else block 中赋值,但是编
我正在使用 TypeScript 3.8 编写 JS 和 TS 混合的代码。我写了以下行: export * as Easing from './easing'; 应该是 fair game在 Typ
我需要将 R 代码中的“/”更改为“\”。我有这样的事情: tmp <- paste(getwd(),"tmp.xls",sep="/") 所以我的 tmp是 c:/Study/tmp.xls 我希望
我有个问题。例如我有这个: id truth count 1 1 1 2 1 2 3 0 0 4 1 1 5 1 2 6 1
我正在尝试使用“IN”和“=”来查找一些 bean。我目前正在使用此代码: $ids = array(1,2,3,4); $user = 1; $things = R::find( 'thing'
是否可以在 Xcode 中部署到其他人的手机上?我没有 iPhone,但我想测试我在 friend 手机上制作的应用程序。在我支付 99 美元之前,我想确保这不会造成麻烦。 谢谢。 最佳答案 不会有任
我试图得到一个非常大的数字(超过 unsigned long long int )。所以我把它作为一个字符串,然后一个数字一个数字地转换成整数并使用它。 #include #include int
我在 Rust 中有 C 语言库的绑定(bind),但它们并不完整。 在 C 代码中,我定义了一个简化的宏,如下所示: #define MY_MACROS1(PTR) (((my_struct1
我正在努力解决这个问题。 http://jsfiddle.net/yhcqfy44/ 动画应该自动相对于 滚动到顶部每次出现滚动条时的高度。 我已经写了这个,但没有运气: var hheight =
我正在处理一个将数字作为字符串返回的 JSON API。例如 "12" ,但是,该字段值也可以是非数字的,例如:"-" . 我已将 JSON 数据解析为映射,我想将此字段提取为 elixir 中的整数
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
我想在 Lucene 中将像“New York”这样的“复合词”索引为单个术语,而不是像“new”、“york”那样。这样,如果有人搜索“new place”,则包含“new york”的文档将不会匹
我希望这个解释能让我更好地了解使用宏的优点。 最佳答案 在函数中,所有参数在调用之前都会被评估。 这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分
我有一些看起来像这样的 XML foo ]]> (注意 > 登录 "> foo")和 XSLT 样式表 当我运行xsltproc stylesheet.xs
当我尝试将 Any 转换为 List 时,如下面的示例所示,我得到“Unchecked cast: Any!”到列表'警告。有没有解决此类问题的方法? val x: List = objectOfTy
我正在使用 Python 开发一个简单的爬虫。目的是创建一个 sitemap.xml。(你可以在这里找到真正的 alpha 版本:http://code.google.com/p/sitemappy/
我想知道在 VBScript 中是否可以在多行中中断 If 语句。喜欢: If (UCase(Trim(objSheet.Cells(i, a).Value)) = "YES") Or _ (UCas
for (String item : someList) { System.out.println(item); } 使用“do while”是否等效? 谢谢。 最佳答案 如果列表为空,f
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Split string with delimiters in C 在 C 中将“,”分隔的列表拆分为数组的最佳方法
我有一个如下所示的字符数组: [0, 10, 20, 30, 670] 如何将此字符串转换为整数数组? 这是我的数组 int i=0; size_t dim = 1; char* array = (c
我是一名优秀的程序员,十分优秀!